John Whitmire Ответов: 0

Почему объект messagequeue.послать(сообщение) в автоматическом режиме не получится... Иногда?


У меня есть локальный MessageQueue с отправителем и получателем, находящимися в одном приложении (служба Windows с отложенным запуском, использующая .NET Framework 4.0). Асинхронное чтение всегда находится в очереди ожидания и переиздается после каждого завершенного чтения или сбоя чтения. Как правило, сообщение помещается в очередь и немедленно считывается из очереди, чтобы продолжить соответствующее действие. Он использует очень простые операции и все настройки по умолчанию, по существу:
MessageQueue myMQ = new MessageQueue(path);
myMQ.ReceiveCompleted += ReceiveCompletedHandler;
myMQ.BeginReceive();
//. . . other stuff . . .
myMQ.Send(new Message(messageBodyObject));
Из протоколированной информации приложения у меня есть доказательства того, что сообщение было успешно доставлено через очередь, но идентичное сообщение, отправленное через три часа, похоже, никогда не попадало в очередь. Было предпринято несколько попыток сделать несколько звонков в MessageQueue.Send(msg), и ожидающее чтение никогда не срабатывало, и сообщение не было замечено ожидающим в очереди (что означало бы, что чтение остановилось).
Что еще хуже, это состояние ошибки сохранялось до перезагрузки компьютера. Завершение работы и перезапуск приложения-службы после перезагрузки окончательно очистили условие, и все возобновило работу, как и ожидалось.
Это не было замечено раньше, но это может быть критической проблемой, если это произойдет снова, так что я должен, по крайней мере, быть в состоянии обнаружить его. Но как вы можете обнаружить ошибку, которая не оставляет доказательств ее возникновения? Если бы я знал, какие условия могут вызвать Send(msg) чтобы потерпеть неудачу тихо, я мог бы найти способ обнаружить его. Но сейчас я ничего не понимаю.

Что я уже пробовал:

Я нашел связанную с этим проблему, которая существовала в более старой версии MSMQ, но она не должна применяться в текущих версиях. Большинство сообщений на форуме, которые я нашел в потерянных сообщениях, были связаны с удаленными очередями и IP-адресами, что здесь неприменимо, поскольку это локальная очередь.
Эта должность[^] on StackOverflow намекает, что сообщение может оказаться в каком-то другом месте, кроме предполагаемой локальной очереди, но MSDN утверждает здесь[^] что "если очередь локальная, то сообщение всегда попадает в очередь." Это, кажется, создает противоречие, которое я не знаю, как разрешить.

0 Ответов