具有多个使用者的 JMS 队列

2022-09-03 14:30:07

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

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

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

由于我的消息有一些耗时的处理,我希望多个使用者同时处理其唯一消息。

我记得在早期版本的JBoss中也有类似的设置,其中此设置没有问题。在 Jboss-6 中,消息传递系统运行良好 - 除了上述问题。这个问题类似于“在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) {}
  }
}

答案 1

当队列上有多个使用者时,消息在使用者之间进行负载平衡。

由于消息需要花费一些时间,因此应通过设置使用者窗口大小来禁用缓冲。

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

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

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

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


答案 2

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


推荐