0

相互に通信する 3 つの層を持つ MSMQ ベースのシステムがあります。簡単にするために、レイヤー 1、2、3 と呼びます。これらは次のように配置されます。

Layer 1 <-> Layer 2 <-> Layer 3

したがって、レイヤー 1 はレイヤー 2 とのみ通信し、レイヤー 3 はレイヤー 2 のみと通信し、レイヤー 2 は他の両方と通信します。これには4つのキューがあり、

Layer1_in
Layer1_out
Layer3_out
Layer3_in

そして、レイヤーはこのインフラストラクチャを介して通信します。

Layer 1 -> Layer1_out -> Layer 2
Layer 1 <- Layer1_in <- Layer 2
Layer 3 -> Layer3_out -> Layer 2
Layer 3 <- Layer3_in <- Layer 2

(これが必要以上に網羅的である場合は申し訳ありません)

とにかく、メッセージはレイヤー 1 からレイヤー 2 に渡され、何らかの処理が行われ、別の (関連する) メッセージがレイヤー 3 に送信され、その逆も同様です。私が抱えている問題は、レイヤー 1 からレイヤー 2 に 2 つのメッセージが送信されることがありますが、両方のメッセージを順番に受信するのではなく、最初のメッセージを 2 回受信することです。メッセージを非同期に受信するためBeginReceiveに onを使用しています。Layer1_outそれが完了すると、受信したメッセージを処理し、BeginReceive再度呼び出して次のメッセージを取得します。

これを追跡するために、送信側にメッセージ カウンターを実装し、それをテキスト ファイルに書き込みました。プロパティを使用して、Extensionこのメッセージ番号の文字列表現を格納し、処理側でメッセージ番号を取得できるようにしています。メッセージを受信すると、この番号を取得して別のファイルに書き込みます。これは、同じ内容の 2 つのファイルを生成する必要がありますが、代わりに次のようなものが表示されます。

00000000000000000214
00000000000000000215
00000000000000000215 <- this is bad!
00000000000000000217
00000000000000000218
00000000000000000219

受信ログでは、メッセージ 215 が 2 回処理され、216 が届かなかったことを示しています。私の目的では、同じメッセージを 2 回処理しても何の影響もありません (そのため、これがしばらくの間見過ごされてきたのはなぜですか) が、メッセージをまったく見逃すことは大きな問題です。

何かご意見は?

4

1 に答える 1

2

問題は解決しました...ある日マルチスレッドのアドバイスを出し、次の日は自分で違反に噛まれるという数字です!

犯人はこの行でした:

receiveResult = <queueName>.BeginReceive()

別のメッセージがすでにキューで待機しているとき、ReceiveCompletedイベントは別のスレッドで発生し、EndReceive(receiveResult)からの戻り値BeginReceiveが実際にreceiveResult変数に書き込まれる前に呼び出しに到達していました。その結果、私はEndReceive同じ値で呼び出し、同じメッセージを再び受け取りました!同期オブジェクトの周囲でイベントハンドラー全体をロックすると、問題が解決しました。

于 2009-06-02T17:30:45.680 に答える