3

MSMQ によって伝送されるメッセージに対して複数のリスナーを持つことは可能ですか?

WCF はサービスの観点からすべてを組み立てるように見え、通信をポイント ツー ポイントの事柄にします。メッセージ キューを使用して、ログをデータベースに記録する別のプロセスの受信トラフィックをバッファリングしたいと考えています。

着信トラフィックの監視に関心のある他のプロセスがいくつでも存在する可能性があり、これはオブザーバー パターンを積極的に要求しますが、少なくとも WCF 経由で MSMQ を使用しない限り、オブザーバー パターンを表現する方法がわかりません。

誰でもこれについて私にアドバイスできますか?


問題を説明するのにも役立つかもしれない理由についての背景: 私は、現場の小さなブラック ボックスからの接続要求を受け入れる Windows サービスを持っています。ソケットをセットアップし、ブラック ボックスは、時間と空間の GPS 位置で注釈が付けられたイベントを説明するメッセージを送信します。

ソケット ストリームからのメッセージ パケットを解析し、MSMQ を介して別のプロセスに送信します。別のプロセスは重複をフィルター処理し、パケットをデータベース テーブルに書き込みます。

着信トラフィックに応じてインクリメンタル計算を行うことでメリットが得られる後処理がいくらでもあり、ユーザー ツールは着信トラフィックにも応じてユーザー通知を実行します。

したがって、1 つのプロセスでメッセージを送信し、いくつかのプロセスでメッセージを受信したいと考えています。これらの受信者の 1 つは、パケットの内容を解析し、メッセージをデータベースに転記します。これは、キューからメッセージを最終的に削除する責任の明らかな候補ですが、これがメッセージを処理する最後のハンドラーであることを確認する方法の問題があります。

4

2 に答える 2

3

MSMQがこの状況を単独で処理するように適切に設計されているとは思いません。メッセージに対して実行できることは、Peek()またはGet()の2つだけです。AFAIK、メッセージがすべてのハンドラーによって処理されたかどうかを追跡する良い方法はありません。

メッセージを転記するプロセスを監視対象とし、メッセージを転記してデータベースに書き込む前に、関心のあるすべてのオブザーバーにメッセージを公開する(おそらく.NETイベントアーキテクチャを使用する)ことが機能する可能性があります。これにより、関心のあるすべてのオブザーバーがメッセージを確認し、メッセージがDBに適切に書き込まれることが保証されます。

于 2008-10-29T21:56:55.453 に答える
0

Publish-Subscribe Channelが必要だと思います:

送信者は、関心のあるすべての受信者にイベントをブロードキャストするにはどうすればよいでしょうか? 特定のイベントのコピーを各レシーバーに配信するパブリッシュ/サブスクライブ チャネルでイベントを送信します。

パブリッシュ-サブスクライブ チャネルは次のように機能します。サブスクライバーごとに 1 つずつ、複数の出力チャネルに分割される 1 つの入力チャネルがあります。イベントがチャネルにパブリッシュされると、Publish-Subscribe チャネルはメッセージのコピーを各出力チャネルに配信します。各出力チャネルにはサブスクライバーが 1 つだけあり、メッセージを 1 回だけ消費することができます。このようにして、各サブスクライバーはメッセージを 1 回だけ受け取り、消費されたコピーはチャネルから消えます。

このパターンは、 MassTransitNServiceBusによって MSMQ の上に実装されます。

于 2013-01-24T21:15:34.853 に答える