2017-11-09 21 views
0

MSMQでトランザクションキューを作成しました。次に、そのキューに2つのメッセージを正常に送信します。最初のメッセージはプロセッサにエラーを引き起こし、MSMQトランザクションはロールバックされます。メッセージはキューに戻されます。 2番目のメッセージは処理され、MSMQトランザクションがコミットされると成功します。MSMQトランザクション

注:最初のメッセージを別の/ポイズンのキューに移動するコードはまだありません。これは、処理が続行され、理論上はメッセージ2が処理されることはありません。

問題:1つのリスナ/プロセッサがそのトランザクションキューからメッセージを処理している場合、メッセージ2は決してピックアップされません。これは予想されます。

ただし、2つのリスナーがある場合は、メッセージ2が選択されます。それは私を混乱させる。 MSMQのトランザクションキューは、到着した順にメッセージを処理できると思っていました。

サイドノート:メッセージ1をさらに処理して別のキューに移動することはできません。 MSMQは、メッセージがプロセッサによって取得された回数をカウントしますか?

答えて

0

メッセージは、読み込まれるまでキューに存在します。 第1リスナーが毒メッセージを読み取ると、トランザクションが中止されメッセージが再び表示されるまで非表示とマークされます。 その間、2番目のリスナーはポイズンメッセージを見ることができず、2番目のメッセージのみが表示されます。

「メッセージ1をさらに処理できず、それを別のキューに移動するにはどうすればよいですか」 - WCF/MSMQには毒メッセージ処理機能が組み込まれています。多数の再試行待ち行列で自分自身をシミュレートすることができます。最初の失敗時には、常にキュー#1を再試行してください。メッセージを再試行し、失敗した場合は常にキュー#2を再試行してください。再度メッセージを試してください。失敗した場合は、調査のために最終キューに移動してください。

"MSMQは、メッセージがプロセッサによって取得された回数をカウントしますか? - No.