Удаленное соединение с MSMQ, очевидно, потеряло проблему при перезагрузке сервера MSMQ - PullRequest
3 голосов
/ 30 мая 2011

Я подключаюсь к удаленному MSMQ в рамках службы Windows и выполняю BeginReceive следующим образом:

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

Метод Process получает сообщение и вызывает EndReceive следующим образом:

message = msmq.EndReceive(asyncResult.AsyncResult);

и затем обрабатывает сообщение, затем снова вызывает BeginReceive, как это:

msmq.BeginReceive();

Проблема в том, что по какой-то причине, когда сервер MSMQ перезагружается, метод Process запускается и попадает в строку EndReceive, которая затем генерирует исключение MessageQueueException. После перезагрузки удаленного сервера больше сообщений не принимается и не обрабатывается, пока я не перезапущу службу Windows.

Мне кажется странным, что метод ReceiveCompletedEventHandler (Process) запускается, а также, почему больше сообщений не поступает после перезагрузки удаленного сервера - я не совсем уверен, как обеспечить восстановление соединения после перезагрузки.

Кто-нибудь знает, почему это происходит? (и как это исправить?).

Примечание - Теперь я добавил некоторый код, который обрабатывает случай, когда вызов EndReceive выдает эту конкретную ошибку, и повторяет цикл, вызывая BeginReceive () снова (с Thread.Sleeps), пока не исчезнет ошибка , Досадно, что, несмотря на то, что это работает, когда сервер MSMQ находится в резервном состоянии и кажется, что BeginReceive работает (то есть не выдает никаких ошибок), сообщения по-прежнему НЕ принимаются.

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Кажется, я решил проблему. Я предпринял следующие шаги:

1) Теперь я переместил свой вызов BeginReceive в отдельный метод, который зацикливается на вызове BeginReceive () до тех пор, пока не останется никаких исключений (бездействие в течение X секунд).

2) Обернут вызов EndReceive в перехвате try, чтобы отразить нечетный случай, когда ReceiveCompletedEventHandler вызывается при перезагрузке сервера MSMQ, и выдает исключение MessageQueueException.

3) В подвохе я вызываю Close () в очереди сообщений. Это важно, без этого это не сработало, затем я снова вызываю свой метод BeginReceive.

0 голосов
/ 15 декабря 2011

Кажется, у меня похожая проблема, но проблема, похоже, заключается в том, что базовый объект msmq потерял соединение с очередью. Попытка работать с методом Refresh () ...

...