MSMQ с проблемой WCF - PullRequest
       17

MSMQ с проблемой WCF

1 голос
/ 18 февраля 2009

Это, хотя, чтобы объяснить, здесь я иду.

Мы создаем программу, в которой отправитель и получатель msmq используют WCF. Мы реализовали обработчик ошибок, очень похожий на этот: http://msdn.microsoft.com/en-us/library/ms751472.aspx в сочетании с http://msdn.microsoft.com/en-us/library/ms789028.aspx

Все отлично работает. Мы даже сделали тестовые случаи, которые запускают сотни сообщений через очередь, и все обрабатывается. Когда мы делаем 10000, мы получаем несколько тайм-аутов, но обработка ошибок работает нормально, поэтому сообщение повторяется несколько раз, а затем оно попадает в очередь отравления.

Я зарегистрировал свой код и выпустил его другим разработчикам. Следующая проблема возникала более одного раза при использовании очереди:

Сообщение, прочитанное неправильно, заканчивается как сообщение об ошибке (в классе PoisonErrorHandler). У него всегда есть это сообщение об исключении (типа FaultException): Сообщение с To 'net.msmq: // localhost / private / adpqueue' не может быть обработано в получателе из-за несоответствия AddressFilter в EndpointDispatcher. Убедитесь, что конечные адреса отправителя и получателя совпадают. В этой ошибке Code.Name = Отправитель и Code.SubCode.Name = DestinationUnreachable

после повторных попыток он становится MsmqPoisonMessageException, он получает LookupId. С этим lookupid я делаю ReceiveByLookupId (lookupId) (со стандартным классом System.Messaging.MessageQueue). Это приводит к InvalidOperationException.

После этого служба перезапустится и цикл возобновится, это никогда не заканчивается. (после перезагрузки, очистки очереди она никогда не останавливается).

Если вы откроете «Управление компьютером» и посмотрите, есть ли в очереди сообщение, оно пустое. Но когда я открываю файл p0000001.mq (в C: \ WINDOWS \ system32 \ msmq \ storage) в текстовом редакторе, вы можете увидеть сообщение. Если вы удалите этот файл, все снова работает. Я не могу воссоздать проблему с помощью приложения (я могу воссоздать проблему, потому что я сохранил поврежденный файл .mq), это иногда случается.

Это не работоспособная ситуация. - Кто-нибудь есть идеи, как я могу решить эту проблему с помощью кода или как предотвратить это? - Почему служба wcf видит сообщение, а MessageQueue с LookupId ничего не видит? Ли другой способ запросить очередь с LookupId? - Как может сложиться такая ситуация? Я вижу все другие сообщения.

1 Ответ

2 голосов
/ 25 февраля 2009

Я наконец нашел свою проблему.

На принимающей стороне очереди я использовал вложенную область транзакции. Когда это произошло: - Получено неверное сообщение - исключение - поймать исключение - распоряжаться вложенной транзакцией

Но исключение было выдано немного раньше, вложенная транзакция еще не была открыта.

Я думаю, что это заразило транзакцию транзакции msmq, и сообщение было заблокировано и нечитаемо ядом. Когда служба была перезапущена, ее можно было снова прочитать, но она снова стала нечитаемой из-за удаления вложенной транзакции.

( чтобы воспроизвести это поведение в получающей операции, просто введите: новый TransactionScope (TransactionScopeOption.Required) .Dispose (); )

...