【问题标题】:NServiceBus custom error handling TransportMessage deserializationNServiceBus 自定义错误处理 TransportMessage 反序列化
【发布时间】:2016-02-05 06:52:44
【问题描述】:

我正在使用我的 CustomFaultManager 来处理失败的消息,因此我可以在将它们放入错误队列之前对其进行处理。

void IManageMessageFailures.ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e)
{

我得到 TransportMessage 并且我必须从以下位置获取类型:

var header = message.Headers["NServiceBus.EnclosedMessageTypes"];
var messageType = MessageTypes.Where(x => x.AssemblyQualifiedName != null 
                                && header.Contains(x.AssemblyQualifiedName)).ToList();

然后应用我的自定义逻辑来解压缩消息(因为我正在压缩大型 msmq 消息)。是否有可能在这种方法中获得一条消息,就像我在 Handle 方法中的原始消息一样?

为什么这会困扰我?现在我需要记住,每当我更改序列化方法或压缩方法时,都要在我的自定义错误处理程序中应用更改。

如果我可以像这样将 TransportMessage 转换为我的自定义消息实现,我会很高兴:

var myMessage = message as MyCustomMessage;

你们知道有没有一种方法可以在 NServiceBus 中进行自定义错误处理而无需手动反序列化?

我尝试转换为我的消息类型(如上所述),但它一直给我 null 结果,因为消息在TransportMessageMessage 字段中序列化

【问题讨论】:

  • 你能解释一下你想在自定义错误处理中实现什么以及你使用的是什么版本的 NServiceBus。那我也许可以为您提供解决方案。顺便提一句。 IManageMes​​sageFailures 始终在 TransportMessage 级别上运行,因此您不是在逻辑消息级别(消息的实际负载)上运行
  • @DanielMarbach 我正在使用 NServiceBus 4.5。我想在消息发送到错误队列之前获取消息。我想获得它的内容(作为我的自定义消息实现)并用它来发挥我的作用。到目前为止我需要处理TransportMessage
  • 您可以选择升级到 5.0 吗?有了行为管道,这变得容易多了。
  • @DanielMarbach 现在不是一个选项。我们最近迁移到 4.5,这真的很痛苦。
  • 你看过突变体吗? docs.particular.net/nservicebus/pipeline/message-mutators,顺便说一句。您介意在特定 dot net 的 daniel dot marbach 与我联系并解释您在迁移时遇到的痛苦吗?对我们来说将是一次很好的学习经历。

标签: c# serialization error-handling nservicebus


【解决方案1】:

我们还在使用旧版本的 NServiceBus (3.x)。到目前为止,我们的解决方案是让我们的消息处理程序捕获任何异常,然后将它们包装在一个自定义异常中,该异常包含我们需要从消息中获取的值。然后我们抛出这个异常让 NServiceBus 处理。

在我们的IManageMessageFailures.ProcessingAlwaysFailsForMessage 实现中,我们根据异常类型以及 NServiceBus.EnclosedMessageTypes 值调用适当的错误处理程序。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多