JMS 预取 + 缓存消费者 + 阻塞消息

JMS Prefetch + Cached Consumers + Stuck Messages

我正在尝试让 JMS 消费者为 ActiveMQ 服务器工作,但是我运行正在解决一些问题,这些解决方案似乎只会导致更多问题。

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

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

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

似乎无论你怎么走,你 运行 都会遇到一些问题。作为最后的手段,我在代理端尝试了 AbortSlowAckConsumerStrategy 设置,但这导致这些消费者经常被中止,听起来这并不是这个设置的真正意义。

有没有人运行遇到同样的问题?有什么方法可以设置具有高预取性能的缓存消费者,而不会 运行 陷入麻烦?

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

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