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 が機能しているように見える (つまり、エラーが発生しない) 場合でも、これは機能しているように見えますが、メッセージは受信されません。