我使用spring作为我的应用程序,在下面的设置中,我面临着奇怪的行为,如果我在侦听器队列上发送1000条消息--如果我在侦听器队列上发送1000条消息--非常快地到达DMLC,并且~10被卡在服务器上,通过进一步的分析,我发现这10条消息不会被发送回服务器--这就是为什么我可以在服务器上看到它们,在返回几个ack之后,但是速度非常慢。
在此基础上,我尝试了cacheConsumers=false在CachingConnectionFactory中,一切都变得很好,但是这使得频繁绑定/解除绑定到mq服务器,并在jmv中创建了巨大的使用者对象,有谁有任何解决方案来解决这个问题保持cacheConsumers=true吗?
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="cachingjmsQueueConnectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="queueDestination" />
<property name="concurrency" value="10-10" />
<property name="cacheLevel" value="1" />
<property name="transactionManager" ref="dbTransactionManager" />
<property name="sessionTransacted" value="true" />
</bean>
<bean id="cachingjmsQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jmsQueueConnectionFactory" />
<property name="reconnectOnException" value="true" />
<property name="cacheConsumers" value="true" />
<property name="cacheProducers" value="true" />
<property name="sessionCacheSize" value="1" />
</bean>发布于 2016-02-16 15:28:01
您可以在cacheConsumer上将cachingConnectionFactory设置为false,也可以在DefaultMessageListenerClass上将cacheLevel更改为级别3 (CACHE_CONSUMER)。这样,使用者将被缓存在DMLC级别,并且应该在不经常看到绑定/取消绑定的情况下解决被卡住消息的问题。
cacheConsumer应该设置为false,您应该让DefaultMessageListenerClasse控制缓存,因为最好让侦听器容器在它的生命周期内处理适当的缓存。Spring文档(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/DefaultMessageListenerContainer.html)中的以下说明讨论了这一点:
注意:不要结合使用Spring的CachingConnectionFactory和动态缩放。理想情况下,完全不要将它与消息侦听器容器一起使用,因为通常最好让侦听器容器自己在其生命周期内处理适当的缓存。此外,停止和重新启动侦听器容器将只使用独立的本地缓存连接,而不是外部缓存的连接。
https://stackoverflow.com/questions/35057107
复制相似问题