具有多个使用者的JMS队列

时间:2011-08-10 09:37:02

标签: java jms jboss6.x hornetq

我有一个带HornetQ的JBoss-6服务器和一个队列:

<queue name="my.queue">  
    <entry name="/queue/test"/>  
</queue>

有一个不同的消费者(在不同的计算机上)连接到此队列,但一次只有一个单个消费者处于活动状态。如果我关闭此消费者,消息会立即由其他消费者处理。

由于我的消息有一些耗时的处理,我希望多个消费者同时处理他们独特的消息。

我记得在早期版本的JBoss中有类似的地方,这个设置没有问题。在Jboss-6中,消息传递系统运行良好 - 除了上述问题。这个问题类似于Are multiple client consumers possible in hornetq?,但情景与我的情况不同。

更新1 :如果我关闭(STRG + C)一个消费者,则会有一个短暂的超时(直到服务器识别出丢失的消费者),直到下一个消费者收到消息为止。

更新2 :代码段

VoidListener ml = new VoidListener();
QueueConnectionFactory qcf = (QueueConnectionFactory)
                             ctx.lookup("ConnectionFactory");
QueueConnection conn = qcf.createQueueConnection();
Queue queue = (Queue) ctx.lookup(queueName);
QueueSession session = conn.createQueueSession(false,
                                               QueueSession.AUTO_ACKNOWLEDGE);

QueueReceiver recv = session.createReceiver(queue,"");
recv.setMessageListener(ml);
conn.start();

MessageListerner:

public class OlVoidListener implements MessageListener
{
  public void onMessage(Message msg)
  {
    counter++;
    logger.debug("Message ("+counter+") received");
    try {Thread.sleep(15*1000);} catch (InterruptedException e) {}
  }
}

2 个答案:

答案 0 :(得分:15)

队列中有多个消费者,消费者之间的消息负载均衡。

由于您有时间消息,您应该通过设置consumer-window-size来禁用缓冲。

在hornetQ上有一个关于分发的例子,关于如何禁用客户端缓冲并为慢速消费者提供更好的支持。 (缓慢的消费者是消费者,他们会有一些时间来处理消息)

消息系统将预取/预读消息到客户端缓冲区,以加快处理速度并避免网络延迟。如果您有快速处理队列和单个消费者,这不是问题。

JBoss Messaging在连接工厂提供了慢速消费者选项,而hornetq提供了消费者窗口大小。

大多数消息系统都会为您提供启用或禁用客户端预取的方法。

答案 1 :(得分:2)

我很抱歉,但我无法理解究竟是什么问题。我们在2.0.0.GA版本和2.2.2.Final中使用了hornetq。在这两种情况下,基于队列的负载平衡工作正常。如果要为一个队列定义多个使用者并且所有队列都处于活动状态,则会自动在它们之间分发消息。消费者A的第一条消息,消费者B的第二条消息,消费者C的第三条消息,依此类推。这是多个消费者的队列工作方式 - 它是免费负载平衡:)这是正常的,当你关闭一个消费者,其他人会收到更多的消息。