只有一个 ActiveMQ 会话正在处理消息

Only one ActiveMQ session is handling messages

在一个项目中,我正在使用ActiveMQ来处理比较多的消息。为此,有一个队列 fooQueue,其中包含要处理的消息。

应用程序的两个实例正在使用 Spring JMS 处理来自该队列的消息。我按以下方式设置了 DefaultMessageListenerContainer

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName(QUEUE_NAME);
container.setMessageListener(myMessageListener);
container.setConcurrency(getProperty("concurrency"));
container.setSessionTransacted(true);
container.setErrorHandler(new ErrorHandler());
return container;

通过查看 AMQ Web 控制台,我可以确认创建了正确数量的消费者和会话 (session/consumer)。但是,似乎一个会话完成了大部分工作,这导致应用程序有时被冻结。

该会话使大多数消息入队和出队,所有其他消息都远少于它。如果我重新启动这两个应用程序实例之一,应用程序实例中的一个会话会接管工作,并且行为相同。

除了检查 myMessageListener 是否阻塞,我还能做些什么吗?

您应该查看消费者的 prefetch 设置及其工作原理。这听起来好像您正在启动一个实例,并且它在其他实例有机会之前从队列中获取了大量消息。降低预取值将导致更公平的分配。

我们尝试了各种设置,增加内存,为每个队列使用单独的 KahaDB 实例等,但没有任何帮助。有帮助的是拆分队列。