1

我正在为我的应用程序使用以下设置的spring DMLC,我面临着DMLC的奇怪行为,如果我在侦听器队列上发送1000条消息,只有~1990条消息很快到达dmlc,而~10条消息卡在服务器上,进一步分析我发现这 10 个确认没有发回,这就是为什么我可以在服务器上看到它们,几分钟后发回确认但速度很慢。

进一步,我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>
4

1 回答 1

2

您可以在 cachingConnectionFactory 上将 cacheConsumer 设置为 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 与动态缩放结合使用。理想情况下,根本不要将它与消息侦听器容器一起使用,因为通常最好让侦听器容器本身在其生命周期内处理适当的缓存。此外,停止和重新启动侦听器容器仅适用于独立的、本地缓存的连接 - 而不是外部缓存的连接。

于 2016-02-16T15:28:01.213 回答