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

How do I deserialize a dead lettered message when dead lettering changes the type?

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

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

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

有什么办法可以解决这个问题吗?

编辑:

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

@mountaintraveller 是正确的,死信消息包含额外的数据(如异常),因此您需要先 'unwrap' 它们。

在这里您可以找到 HosePipe 的源代码(没有它的包): https://github.com/EasyNetQ/EasyNetQ/tree/master/Source/EasyNetQ.Hosepipe

它包含您可以用来

的所有代码
  • 再次阅读并发布
  • 将消息写入磁盘

例如,查看此代码以弹出错误队列的消息: https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ.Hosepipe/QueueRetrieval.cs

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

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

看起来 Hosepipe 是用来读取错误队列的,这是不同的,但仍然是我需要处理的事情,所以感谢您的参考。