Очередь JMS с несколькими потребителями - PullRequest
15 голосов
/ 10 августа 2011

У меня есть сервер 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) {}
  }
}

Ответы [ 2 ]

15 голосов
/ 10 августа 2011

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

Поскольку у вас есть некоторое время, отнимающее сообщение, вы должны отключить буферизацию, установив размер окна получателя.

На hornetQ есть пример в дистрибутиве о том, как отключить буферизацию клиента и обеспечить лучшую поддержку для медленных потребителей.(медленный потребитель - это потребитель, у которого будет некоторое время на обработку сообщения) * Системы сообщений

будут предварительно извлекать / опережать сообщения в буфер клиента, чтобы ускорить обработку и избежать задержек в сети.Это не проблема, если у вас есть очереди быстрой обработки и один потребитель.

JBoss Messaging предлагает опцию медленного потребителя на фабрике соединений, а hornetq предлагает размер окна потребителя.

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

2 голосов
/ 10 августа 2011

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

...