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