Как сохранить порядок сообщений при использовании сообщений из ActiveMQ? - PullRequest
3 голосов
/ 09 января 2009

У меня есть служба .NET, которая использует клиент ActiveMQ. Я реализовал MessageListener с транзакционным соединением для приема сообщений.

Иногда я получаю сообщения в другом порядке, в котором они помещаются в очередь.

Было ли неправильно использовать MessageListner? Есть ли способ сохранить порядок сообщений?

К вашему сведению: один производитель помещает сообщения в очередь, а один потребитель вытягивает сообщения из очереди.

Ответы [ 4 ]

1 голос
/ 19 января 2009

Дополнительная информация: Сервер, который я вызываю, является сторонним, и я не могу контролировать, какие сообщения он отправляет. На основании идентификаторов сообщений я знаю, что они размещены в правильном порядке. Кроме того, в этой системе есть разница между ACK и Acknowledge. ACK получен, когда мое исходное сообщение помещено в «исходящую» очередь. Затем я отслеживаю «входящую» очередь ответов. Я обычно получаю «Подтверждение», затем «Проход» или «Неудача». Идентификатором корреляции для этих сообщений является идентификатор сообщения от ACK.

Первоначально я использовал прослушиватель сообщений и отвечал на событие OnMessge. Я отказался от этого подхода после того, как понял, что с помощью этого метода сообщения доставляются асинхронно и, следовательно, в произвольном порядке. Итак, я изменил свой код для опроса, используя таймер (System.Threading.Timer), чтобы вызывать consumer.Receive () и получать одно сообщение за раз. Это работает так, как я хочу.

Я открываю потребителя один раз при запуске службы и постоянно опрашиваю сообщения.

1 голос
/ 09 января 2009

Вам не нужно ничего делать, чтобы поддерживать порядок; это одна из вещей, которую делает для вас очередь сообщений. Я думаю, что если у вас есть один потребитель, слушающий очередь, и он обрабатывает сообщения не по порядку, то вы либо обнаружили ошибку, либо сообщения не помещены в очередь в том порядке, в каком вы думаете.

Также есть этот вопрос из ActiveMQ FAQ , который может помочь.

Редактировать: Прочитав комментарии к ответ Даффимо , похоже, что вы немного переоцениваете силы. Как правило, такие очереди сообщений, как ActiveMQ, MQ Series, joram и т. Д., Имеют две характеристики: они доставляют сообщения в том же порядке, в котором они помещены в очередь, и гарантируют доставку сообщения. Отправка отдельного сообщения ACK является избыточной; это немного похоже на фиксацию транзакции базы данных, а затем запрос той же информации для повторной проверки того, что база данных действительно ее сохранила.

Сказав это, ваш сервер многопоточный? Если это так, он может поставить в очередь ответ до , он поставит в очередь ACK.

0 голосов
/ 09 января 2009

Все, что только что сказал Джейсон. Несколько других вещей, чтобы быть осторожным. Вы держите потребителя открытым для большого количества сообщений, верно? Вы не создаете потребителя для нескольких сообщений, а затем закрываете его? Только закрытие потребителя приводит к тому, что сообщения, связанные с потребителем, возвращаются в очередь, что может нарушить порядок.

Это связано с откатами? (Откатываете ли вы какие-либо транзакции?).

Наконец, вы всегда можете обеспечить порядок, используя Resequencer , чтобы изменить порядок вещей для вас.

0 голосов
/ 09 января 2009

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

Если вам нужен идентификатор корреляции для сопоставления ответа с конкретным запросом, это другой вопрос. Это то, что вы имеете в виду?

...