ActiveMQからのメッセージを消費するときに、メッセージの順序をどのように保持しますか?

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

  •  06-07-2019
  •  | 
  •  

質問

ActiveMQクライアントを使用する.NETサービスがあります。メッセージを消費するために、トランザクション接続でMessageListenerを実装しました。

ときどき、キューに入れられた順序とは異なるメッセージを受け取ります。

MessageListnerを使用するのは間違っていましたか?メッセージの順序を保持する方法はありますか?

FYI:メッセージをキューに入れるプロデューサーと、キューからメッセージをプルするコンシューマーが1人います。

役に立ちましたか?

解決 2

詳細:呼び出すサーバーはサードパーティであり、送信するメッセージを制御できません。メッセージIDに基づいて、正しい順序で配置されていることを知っています。また、このシステムでは、ACKとAcknowledgeに違いがあります。 ACKは、元のメッセージが「送信」に置かれたときに受信されます。キュー。次に、「インバウンド」を監視します;応答のキュー。私は通常「謝辞」を受け取ります。その後に「パス」が続きます。または「失敗」。これらのメッセージの相関IDは、ACKからのメッセージIDです。

私はもともとメッセージリスナを使用し、OnMessgeイベントに応答していました。この方法を使用すると、メッセージは非同期に配信されるため、特定の順序で配信されないことに気付いた後、このアプローチを放棄しました。そのため、タイマー(System.Threading.Timer)を使用してポーリングし、consumer.Receive()を呼び出して、一度に1つのメッセージを取得するようにコードを変更しました。これは私が望むように機能します。

サービスの開始時にコンシューマを1回開き、メッセージを継続的にポーリングします。

他のヒント

順序を維持するために何もする必要はありません。これは、メッセージキューが行うことの1つです。キューをリッスンしている単一のコンシューマーがいて、メッセージを順番どおりに処理していない場合、バグを発見したか、メッセージが思った順序でキューに登録されていないのではないかと思います。

また、この質問もあります ActiveMQ FAQ から。

編集: duffymoの回答、少し過剰に設計し過ぎているようです。一般に、ActiveMQ、MQ Series、joramなどのメッセージキューには、キューに入れられたのと同じ順序でメッセージを配信することと、メッセージ配信を保証するという2つの特性があります。別のACKメッセージを送信することは冗長です。これは、データベーストランザクションをコミットしてから、同じ情報をクエリして、データベースが実際に保存したことを再確認するようなものです。

それはあなたのサーバーはマルチスレッドですか?そうである場合、応答をキューに入れる前にキューに入れることができる場合があります

メッセージの順序が重要な理由MessageListenerは気にする必要はありません。

応答を特定の要求と一致させるために相関IDが必要な場合、それは別の問題です。それはあなたの言うことですか?

ジェイソンはすべて言った。他にも注意すべきことがいくつかあります。あなたは消費者を多くのメッセージに対して開かれたままにしていますか?いくつかのメッセージのコンシューマを作成してから閉じませんか?コンシューマを閉じるだけで、コンシューマに関連付けられたメッセージがキューに戻され、順序が崩れる可能性があります。

ロールバックに関連していますか? (トランザクションをロールバックしていますか?)。

最後に、リシーケンサーを使用して、常に順序を確認できます。あなた。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top