【问题标题】:JMS Prefetch + Cached Consumers + Stuck MessagesJMS 预取 + 缓存的消费者 + 卡住的消息
【发布时间】:2015-07-16 14:58:04
【问题描述】:

我正在尝试让 JMS 消费者使用 ActiveMQ 服务器,但是我遇到了一些问题,该解决方案似乎只会导致更多问题。

我正在使用 Spring 的 DMLC(cacheLeve 设置为 CACHE_CONNECTION)和 CachingConnectionFactory(cachingConsumers 设置为 true),将 Activemq 自己的 ConnectionFactory 包装在部署在 Jboss AS 中的 Webapp 中。

根据http://activemq.apache.org/what-is-the-prefetch-limit-for.html 这样的设置应该将预取设置为 0 但是在我们的测试中,当我们这样做时,我们注意到 DMLC 以 ​​-1 超时调用 fetch 命令,这意味着它永远等待来自代理的消息当我们试图从 Jboss 取消部署它时,这反过来又导致 Web 应用程序挂起,因此它实际上不会被取消部署。

将预取更改为更高的值会导致消息卡在 activemq 中,如 http://tmielke.blogspot.se/2012/03/camel-jms-with-transactions-lessons.html 中的第 6 点所述,消费者从不消费他们预取的消息。

似乎无论你去哪里,你都会遇到一些问题。作为最后的手段,我在代理端尝试了 AbortSlowAckConsumerStrategy 设置,但这会导致这些消费者经常被中止,听起来这并不是这个设置的重点。

有人遇到过同样的问题吗?有没有什么方法可以设置缓存消费者的高预取性能而不会遇到问题?

【问题讨论】:

    标签: java spring jms activemq spring-jms


    【解决方案1】:

    在 DMLC 的连接工厂中缓存消费者并没有真正的好处,因为消费者通常是长期存在的。它在使用动态缩放(可调整并发)时会导致问题,因为消费者被缓存并且任何预取的消息都会被卡在缓存中。关闭 CF 中的消费者缓存。

    有关更完整的说明,请参阅this answer

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2013-08-08
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多