15

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

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

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

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

我记得在早期版本的 JBoss 中也有类似的情况,这种设置可以正常工作。在 Jboss-6 中,消息系统运行良好——除了上面描述的问题。这个问题类似于Are multiple client consumer 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) {}
  }
}
4

2 回答 2

15

队列上有多个消费者,消息在消费者之间是负载平衡的。

由于您有一些时间消耗消息,您应该通过设置消费者窗口大小来禁用缓冲。

在 hornetQ 上有一个关于如何禁用客户端缓冲并为慢速消费者提供更好支持的示例。(慢消费者是指有时间处理消息的消费者)

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

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

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

于 2011-08-10T14:43:19.540 回答
2

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

于 2011-08-10T10:00:10.957 回答