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

Rabbitmq 当死信更改类型时,如何反序列化死信消息?,rabbitmq,easynetq,Rabbitmq,Easynetq,我正在尝试编写一个死信处理程序服务,它从死信队列中读取消息,然后根据消息的类型、内容等对消息进行处理 在我的C#应用程序中,我使用的是EasyNetQ。我有一个名为MyMessage的基本消息类型,然后是一些子类型。EasyNetQ在序列化消息、将消息发送到exchange、将消息从队列中拉出,然后将消息反序列化回原始类型方面没有问题 但是,如果我在死信处理程序中设置AdvancedBus以使用MyMessage类型从死信队列中使用,死信消息将开始进入错误队列而不是死信队列。显然,当消息死掉时,

我正在尝试编写一个死信处理程序服务,它从死信队列中读取消息,然后根据消息的类型、内容等对消息进行处理

在我的C#应用程序中,我使用的是EasyNetQ。我有一个名为MyMessage的基本消息类型,然后是一些子类型。EasyNetQ在序列化消息、将消息发送到exchange、将消息从队列中拉出,然后将消息反序列化回原始类型方面没有问题

但是,如果我在死信处理程序中设置AdvancedBus以使用MyMessage类型从死信队列中使用,死信消息将开始进入错误队列而不是死信队列。显然,当消息死掉时,消息会以某种方式发生更改,无法再进行反序列化

有没有办法绕过这个问题

编辑:


我甚至可能从根本上误解了这个问题。如果队列上没有EasyNetQ使用者,死信队列将按预期工作,但一旦有使用者,它就会阻塞并开始将所有消息放入错误队列。我甚至尝试使用基本IMessage类型而不是我的类型。没有区别。它仍然是错误的。

@mountaintraveler是正确的,死信消息用额外的数据包装(如异常),因此您需要先“打开”它们

在这里,您可以找到软管的来源(没有相应的软件包):

它包含所有可以用来

  • 再次阅读并发布它们
  • 将消息写入磁盘
有关弹出错误队列消息的示例,请参见以下代码:

事实证明,EasyNetQ会在队列中的所有消息被消费之前查看它们。如果其中一个注册使用者正在查找无法反序列化的类型,EasyNetQ会将其从队列中拉出来并将其转储到错误队列中,而不仅仅是让使用者自己处理错误

在我的例子中,我有一个超类型“MyMessage”,消费者使用它订阅队列。然后,生产者发布MyMessage子类型的消息。问题是生产者和消费者位于不同的程序集中,虽然两者都知道MyMessage,但只有生产者知道子类型。EasyNetQ无法反序列化,因为它不知道整个消息的架构。一旦我在引用中包含了子类型,它就开始工作了


看起来软管是用来读取错误队列的,这是不同的,但我仍然需要处理一些事情,因此,感谢您的参考。

从内存中,死信队列确实将消息转换为不同的格式,而不是EasyNetQ可以将消息转换为
MyMessage
IMessage
的原始格式。试着在EasyNetQ源代码中查找软管:这显示了如何从死信队列中提取消息。