Это, хотя, чтобы объяснить, здесь я иду.
Мы создаем программу, в которой отправитель и получатель 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?
- Как может сложиться такая ситуация? Я вижу все другие сообщения.