【问题标题】:Why messages are stuck on solace server?为什么消息卡在慰藉服务器上?
【发布时间】:2016-02-16 23:28:01
【问题描述】:

我在我的应用程序中使用 spring DMLC,设置如下进一步分析,我发现这 10 个确认没有发回,这就是为什么我可以在服务器上看到它们,几分钟后发回确认但速度很慢。

进一步说,我在 CachingConnectionFactory 中尝试了cacheConsumers=false,一切都变得很好,但是这使得频繁绑定/取消绑定到 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>

【问题讨论】:

  • 实际的jmsConnectionFactory 是什么?另外,您为什么要使用CachingConnectionFactory 并在 DMLC 上进行缓存?使用直接jmsConnectionFactory 并将cacheLevel 设置为3。通常在事务环境(尤其是 JTA)中,缓存会破坏事情,尤其是在缓存消费者时。
  • jmsConnectionFactory 是由 solace lib 提供的 connectionfactory 对象,它工作正常,我检查了一下。如果我选择cacheLevel=3,我会看到同样的问题,所以尽管将其缓存在CachingConnectionFactory 中。是的,它似乎破坏了我的应用程序,有什么解决方案可以让它变得更好吗?
  • 在使用transactionManager 时,我们在使用 DLMC 缓存消费者时遇到问题,因此我们只缓存会话,而其他所有内容(生产者和消费者)都会重新创建。
  • 我看到您的并发配置是 "10-10",但是当使用可变容器并发时,您应该永远在 CCF 中缓存消费者 - 否则当工作人员数量减少时,消费者放入缓存中,没有从该消费者获取任何内容,因此您看到的行为就是随后发生的事情 - 代理认为缓存的消费者是活动的。 DLMC 消费者通常寿命较长,因此您不应看到大量消费者创建。
  • 不建议将缓存消费者保留在具有可变并发性的 DMLC 中,因此我将其固定为 10-10,我也没有在 DMLC 中缓存消费者,而是在 CCF 中缓存消费者,但是我看到你提到的有点相同的问题以上,有解决办法吗? @M Deinum 提到的事务管理器真的有问题吗?没有人解决这个问题?

标签: java spring jms spring-jms solace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2021-01-16
    • 2018-01-30
    • 1970-01-01
    • 2020-09-20
    • 2019-09-04
    相关资源
    最近更新 更多