rabbitmq 当死信更改了类型时,如何反序列化死信消息?

mxg2im7a  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(218)

我正在尝试编写一个死信处理程序服务,它从死信队列中读取消息,然后根据类型、内容等对消息进行处理。
在我的C#应用程序中,我使用的是EasyNetQ。我有一个基本的消息类型MyMessage,然后还有许多子类型。EasyNetQ在序列化消息、将它们发送到交换、将它们从队列中拉出来,然后将消息反序列化回原始类型方面没有问题。
但是,如果我在死信处理程序中设置AdvancedBus,使用MyMessage类型从死信队列中使用,死信消息将开始进入错误队列,而不是死信队列。显然,当消息是死信时,消息会以某种方式发生更改,无法再进行反序列化。
有什么办法可以解决这个问题吗?
编辑:
我甚至可能从根本上误解了这个问题。如果队列中没有EasyNetQ消费者,死信队列会按预期工作,但一旦有了消费者,它就会阻塞,并开始将所有消息放入错误队列。我甚至尝试使用基本IMessage类型而不是我的类型。没有区别。它仍然会出错。

n6lpvg4x

n6lpvg4x1#

@mountaintraveler是正确的,死信消息用额外的数据 Package (如异常),因此您需要首先“解开”它们。
在这里你可以找到HosePipe的源代码(没有它的软件包):https://github.com/EasyNetQ/EasyNetQ/tree/master/Source/EasyNetQ.Hosepipe
它包含了您可以用来

  • 再次阅读并发布
  • 将消息写入磁盘

例如,请参阅以下代码,以弹出错误队列中的消息:https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ.Hosepipe/QueueRetrieval.cs

0wi1tuuw

0wi1tuuw2#

事实证明,EasyNetQ会在队列中的所有消息被使用之前提前查看它们。如果注册的使用者之一正在寻找一个它无法反序列化的类型,EasyNetQ会将其从队列中拉出来并转储到错误队列中,而不是让使用者自己处理错误。
在我的例子中,我有一个超类型“MyMessage,”使用者使用它来订阅队列。然后,生成者发布MyMessage的子类型的消息。问题是生成者和使用者在不同的程序集中,虽然两者都知道MyMessage,EasyNetQ无法反序列化,因为它不知道整个消息的架构。一旦我在引用中包含了子类型,它就开始工作了。
看起来软管是用来读取错误队列的,这是不同的,但仍然是我需要处理的东西,所以感谢参考。

相关问题