JMS-очередь с несколькими потребителями

У меня есть сервер JBoss-6 с HornetQ и одна очередь:

<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 предложила вариант медленного потребления в соединении factory, а hornetq - размер потребительского окна.

Большинство систем сообщений предоставят вам возможность включить или отключить предварительную выборку клиента.

Ответ 2

Извините, но я не понимаю, в чем проблема. Мы использовали hornetq в версии 2.0.0.GA и 2.2.2.Final. В обоих случаях балансировка нагрузки на основе очереди работает нормально. Если вы определите нескольких потребителей для одной очереди, и все они будут активны, сообщения будут распределены между ними автоматически. Первое сообщение потребителю A, второе - потребителю B, третье - потребителю C и т.д. Вот как работают очереди с несколькими потребителями - это бесплатная балансировка нагрузки:). Нормально, что когда вы закрываете одного потребителя, другие получат больше сообщений.