在一个项目中,我使用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控制台,我可以确认创建了正确数量的使用者和会话(会话/消费者)。但是,似乎一个会话正在完成大部分工作,这导致应用程序有时被冻结。
该会话将大多数消息排队并出列,所有其他消息远远少于它。如果我重新启动这两个应用程序实例中的一个,那么应用程序实例中的一个会话将获取工作,并且行为相同。
除了检查myMessageListener
是否阻止外,还有什么我可以做的吗?
答案 0 :(得分:0)
您应该查看消费者的prefetch设置及其工作原理。这听起来好像你正在启动一个实例,并且在其他人有机会之前从队列中抓取大量消息。降低预取值将导致更公平的分发。
答案 1 :(得分:0)
我们尝试过各种设置,增加内存,为每个队列使用单独的KahaDB实例等,但没有任何帮助。什么帮助是分裂队列。