首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultMessageListenerContainer线程问题

DefaultMessageListenerContainer线程问题
EN

Stack Overflow用户
提问于 2014-12-29 15:45:43
回答 1查看 1.7K关注 0票数 0

我正在使用SpringJMS4.1。

自从上一篇文章(在DefaultJmsListenerContainerFactory中使用CachingConnectionFactory )以来,我一直在使用CachingConnectionFactory (将cacheConsumers设置为false)和DefaultJmsListenerContainerFactory

代码语言:javascript
复制
<bean id="cachedConnectionFactory" 
          class="org.springframework.jms.connection.CachingConnectionFactory"
        p:targetConnectionFactory-ref="jmsConnectionFactory"
        p:cacheConsumers="false"
        p:sessionCacheSize="3" />
<bean id="jmsListenerContainerFactory"
          class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"
          p:connectionFactory-ref="cachedConnectionFactory"
          p:destinationResolver-ref="jndiDestinationResolver"
          p:concurrency="3-5"
          p:backOff-ref="exponentialBackOff"
          p:receiveTimeout="1000" />

我现在正在尝试使用我用编程方式定义的侦听器类:

代码语言:javascript
复制
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
    ...
    MyListener receiver = new MyListener();
    ...
    MessageListenerAdapter adapter = new MessageListenerAdapter(listener);
    adapter.setDefaultListenerMethod("onMessage");
    ...
    SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
    endpoint.setId(endpointId);
    endpoint.setDestination(...);
    endpoint.setMessageListener(adapter);
    registrar.registerEndpoint(endpoint);
}

它可以工作,因为我的侦听器类很好地接收了消息,但是日志看起来很奇怪。启动后,似乎只有一个线程在处理消息,即使队列中有几个线程在等待消息:

代码语言:javascript
复制
2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-1] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-3] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,978: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:10:53,995: INFO  [DefaultMessageListenerContainer-2] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:05,318: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:10,052: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:14,506: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:18,825: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:21,715: INFO  [DefaultMessageListenerContainer-4] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:21,725: INFO  [DefaultMessageListenerContainer-5] [MyListener.instantiateProcess():164] - Processing message
2014-12-29 15:11:25,152: INFO  [DefaultMessageListenerContainer-5] [MyListener.instantiateProcess():164] - Processing message
...
DefaultMessageListenerContainer-5 only until all 60 remaining messages have been read...

正如您最终所看到的,只有容器#5被用来处理所有剩余的消息。消息不会并行处理,并且定义的并发似乎不被使用。我不知道是否是同一个问题,但我看了一下这个post,但我没有使用ActiveMQ,也没有这个预取选项。

请你解释一下为什么我有这种行为。这是Spring的错误配置,还是其他地方的问题?

谢谢

EDIT:eventually --我在messages上找到了一个选项,可以不保持消息的顺序,而且情况正在好转。有更好的线程使用..。不过,我可以看到:

  • 首先,使用5个DefaultMessageListenerContainer线程(最大并发值);
  • 当剩下25条消息时,只有3条(并发的核心值)在处理消息;
  • 最终只有一个在处理剩下的15条信息..。

为什么最大线程数(5)或至少核心数(即。( 3)在排完队后才使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-08 02:07:49

虽然这个问题很久以前就被问到了。我最近也面临这个问题。为了他人的利益而张贴答案。

需要将prefetch限制设置为1,可以在连接字符串中提供此限制。

代码语言:javascript
复制
tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1

参考http://activemq.apache.org/what-is-the-prefetch-limit-for.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27691890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档