Как десериализовать сообщение с мертвой буквой, когда неформатная буква меняет тип?

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

В моем приложении C# я использую EasyNetQ. У меня есть базовый тип сообщения под названием MyMessage, а затем несколько подтипов. У EasyNetQ нет проблем с сериализацией сообщений, отправкой их на обмен, извлечением их из очереди и последующей десериализацией сообщения обратно в исходный тип.

Однако, если я настроил AdvancedBus в своем обработчике недоставленных писем для использования из очереди недоставленных писем с использованием типа MyMessage, сообщения о недоставленных письмах начнут поступать в очередь ошибок вместо очереди недоставленных сообщений. По-видимому, сообщение каким-то образом изменяется, когда оно является мертвыми буквами, и больше не может быть десериализовано.

Есть ли способ обойти это?

Редактировать:

Я, возможно, даже принципиально неправильно понимаю проблему. Если в очереди нет получателя EasyNetQ, очередь недоставленных сообщений работает, как и ожидалось, но как только появляется получатель, он задыхается и начинает помещать все сообщения в очередь ошибок. Я даже пытался использовать базовый тип IMessage вместо моего типа. Нет разницы. Это все еще ошибки.

2 ответа

Решение

Оказывается, EasyNetQ просматривает все сообщения в очереди, прежде чем они будут использованы. Если один из зарегистрированных потребителей ищет тип, который он не сможет десериализовать, EasyNetQ вытаскивает его из очереди и сбрасывает в очередь ошибок, а не просто позволяет потребителю обрабатывать ошибку самостоятельно.

В моем случае у меня был супертип "MyMessage", который потребитель использовал для подписки на очередь. Затем продюсер публиковал сообщения подтипов MyMessage. Проблема заключалась в том, что производитель и потребитель были в разных сборках, и хотя оба знали о MyMessage, только производитель знал о подтипах. EasyNetQ не удалось десериализовать, потому что он не знал схему всего сообщения. Как только я включил подтипы в ссылку, он начал работать.

Похоже, что Hosepipe предназначен для считывания очереди ошибок, которая отличается, но все же кое-что мне нужно обработать, так что спасибо за ссылки.

@mountaintraveller верен, сообщения о мертвых письмах заключены в дополнительные данные (например, исключение), поэтому вам нужно сначала "развернуть" их.

Здесь вы можете найти источник для HosePipe (для него нет пакета): https://github.com/EasyNetQ/EasyNetQ/tree/master/Source/EasyNetQ.Hosepipe

Он содержит весь код, который вы можете использовать для

  • прочитайте и опубликуйте их снова
  • записывать сообщения на диск

Посмотрите, например, этот код для вывода сообщений из очереди ошибок: https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ.Hosepipe/QueueRetrieval.cs

Другие вопросы по тегам