我正在使用SpringJMS4.1。
自从上一篇文章(在DefaultJmsListenerContainerFactory中使用CachingConnectionFactory )以来,我一直在使用CachingConnectionFactory (将cacheConsumers设置为false)和DefaultJmsListenerContainerFactory
<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" />我现在正在尝试使用我用编程方式定义的侦听器类:
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);
}它可以工作,因为我的侦听器类很好地接收了消息,但是日志看起来很奇怪。启动后,似乎只有一个线程在处理消息,即使队列中有几个线程在等待消息:
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上找到了一个选项,可以不保持消息的顺序,而且情况正在好转。有更好的线程使用..。不过,我可以看到:
DefaultMessageListenerContainer线程(最大并发值);为什么最大线程数(5)或至少核心数(即。( 3)在排完队后才使用?
发布于 2019-04-08 02:07:49
虽然这个问题很久以前就被问到了。我最近也面临这个问题。为了他人的利益而张贴答案。
需要将prefetch限制设置为1,可以在连接字符串中提供此限制。
tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1参考http://activemq.apache.org/what-is-the-prefetch-limit-for.html
https://stackoverflow.com/questions/27691890
复制相似问题