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

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

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

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

我记得在早期版本的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) {}
  }
}

最佳答案

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

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

在hornetQ上,有一个分发示例,说明如何禁用客户端缓冲并为速度较慢的使用者提供更好的支持。 (速度较慢的使用者是需要一些时间来处理消息的使用者)

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

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

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

09-10 12:33