WCF через MSMQ привязки. Как определить, когда сообщение перемещается в очередь отравления?
Я использую клиент WCF, который вызывает службу WCF через MsmqBinding. Framework.Net 4.0, клиент и сервер работает на Windows Server 2008 R2. Очередь канала является транзакционной.
Служба размещается с этими параметрами привязки:
receiveErrorHandling="Move"
receiveRetryCount="3"
retryCycleDelay="00:00:20"
maxRetryCycles="5"
Учитывая, что ((ReceiveRetryCount+1) * (MaxRetryCycles + 1)) действует, это приведет к 4*6 = 24 повторным попыткам любого данного сообщения, прежде чем оно будет перемещено в подозрительный очередь.
Присоединяя IErrorHandler к моему сервису, я замечаю, что HandleError вызывается с MsmqPoisonMessageException в общей сложности 6 раз (для подозрительного сообщения), прежде чем подсистема wcf, наконец, переместит сообщение в;
Я хочу записать точное время, когда сообщение завершено, повторяется, и сообщение перемещается в очередь отравления. Мне кажется, что единственная возможность - подсчитать, сколько раз в сообщении возникли сбои, и сравнить это число с привязкой MaxRetryCycles. Это неловко и подвержено ошибкам.
Мой вопрос:
- Есть ли способ для меня, чтобы окончательно обнаружить событие, когда подсистема wcf перемещает сообщение в очередь отравления?
Мои ссылки: http://msdn.microsoft.com/en-us/library/aa395218.aspx
2 ответа
Количество повторных попыток, конечно же, зависит от ваших параметров; однако в вашем IErrorHandler вы можете явно переместить сообщение в очередь отравлений самостоятельно. В противном случае он всегда будет перемещаться в зависимости от параметров привязки и будет обнаружен при прослушивании очереди отравления, как и любая другая очередь.
Существует ряд хороших решений для мониторинга, которые можно использовать для отслеживания очередей сообщений на предмет поступления сообщений. MonitorWang - это программа с открытым исходным кодом, которая может определять, когда сообщение поступило в подозрительное сообщение или очередь ошибок. Обнаружение, когда сообщение было получено в очереди ошибок, является более надежным, чем попытка определить, когда сообщение было отправлено в очередь ошибок.