Как сохранить порядок сообщений при использовании сообщений из ActiveMQ?

StackOverflow https://stackoverflow.com/questions/426532

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение 2

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

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

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

Другие советы

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

Кроме того, есть этот вопрос из часто задаваемых вопросов ActiveMQ , которые могут помочь.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top