4

Windows サービス内のリモート MSMQ に接続し、次のように BeginReceive を実行しています。

msmq.ReceiveCompleted += new ReceiveCompletedEventHandler(Process);
msmq.BeginReceive();

Process メソッドはメッセージを取得し、次のように EndReceive を呼び出します。

message = msmq.EndReceive(asyncResult.AsyncResult);

メッセージを処理してから、次のように BeginReceive を再度呼び出します。

msmq.BeginReceive();

問題は、何らかの理由で MSMQ サーバーが再起動すると、Process メソッドが起動し、EndReceive 行に到達して MessageQueueException をスローすることです。リモート サーバーが再起動すると、Windows サービスを再起動するまでメッセージの受信と処理が行われません。

ReceiveCompletedEventHandler メソッド (プロセス) が起動しているのと、リモート サーバーの再起動後にメッセージが受信されないのは奇妙に思えます。再起動後に接続が再確立されることを確認する方法がよくわかりません。

なぜこれが起こっているのか誰にも分かりますか?(そしてそれを修正する方法は?)。

- EndReceive 呼び出しがこの特定のエラーをスローした場合を処理するコードをいくつか追加し、エラーがなくなるまで (Thread.Sleeps を使用して) BeginReceive() を再度呼び出してループします。厄介なことに、MSMQ サーバーがバックアップされ、BeginReceive が機能しているように見える (つまり、エラーが発生しない) 場合でも、これは機能しているように見えますが、メッセージは受信されません。

4

2 に答える 2

4

問題は解決したようです。私は次の手順を実行しました。

1)これで、BeginReceive呼び出しを別のメソッドに移動しました。このメソッドは、例外がなくなるまで(X秒間スリープする)BeginReceive()の呼び出しをループします。

2)EndReceive呼び出しをtry catchでラップして、MSMQサーバーの再起動時にReceiveCompletedEventHandlerが呼び出され、MessageQueueExceptionがスローされるという奇妙なケースをキャッチします。

3)キャッチでは、メッセージキューでClose()を呼び出します。これは重要です。これがないと機能しませんでした。その後、BeginReceiveメソッドを再度呼び出します。

于 2011-05-31T10:27:57.710 に答える
0

同様の問題があるようですが、問題は、基になる msmq オブジェクトがキューへの接続を失ったという事実にあるようです。Refresh() メソッドを使用しようとしています...

于 2011-12-15T17:18:09.833 に答える