【问题标题】:NServiceBus message interception?NServiceBus 消息拦截?
【发布时间】:2017-08-14 17:22:54
【问题描述】:

有什么办法可以截取NServiceBus中的消息?

从现在开始,我可以通过像这样引入基本消息处理程序来手动完成:

public abstract class MessageHandler<T> : IHandleMessages<T>
    where T : IMessage
{
    public IBus Bus { get; set; }

    protected abstract void HandleCommand(T command);

    public void Handle(T command)
    {
        // perform some logic on *command* before
        HandleCommand(command);
        // perform some logic on *command* after
    }
}

及用法:

public class ConcreteMessageHandler : MessageHandler<ConcreteMessage>
{
    protected override void HandleCommand(ConcreteMessage message)
    {
        //handle command
    }
}

但是这样做我失去了订阅多条消息的能力(因为我不能从多个 MessageHandler&lt;&gt; 类继承)。

【问题讨论】:

    标签: .net nservicebus


    【解决方案1】:

    如果你使用的是 NServiceBus V3,你可以看看 IMutateOutgoingMessages 和 IMutateIncomingMessages 接口。

    http://support.nservicebus.com/customer/portal/articles/894155-nservicebus-message-mutators-sample

    或者,如果您想让消息按特定顺序通过处理程序,请查看此链接:

    http://support.nservicebus.com/customer/portal/articles/862397-how-do-i-specify-the-order-in-which-handlers-are-invoked-

    【讨论】:

      【解决方案2】:

      NServiceBus 现在为消息处理管道提供了广泛的可扩展性选项,请参阅https://docs.particular.net/nservicebus/pipeline/ 了解更多详情

      【讨论】:

      • 很抱歉让您对代码示例感到困惑。我已经更新了 Handle() 方法中的 cmets。正如标题所说,我正在寻找消息拦截。如您所知,NServiceBus 模块不能用于此,因为它们包装传输消息,而不是逻辑。
      • 啊,那么您的选择是为您配置为在常规处理程序之前和之后运行的相同消息创建额外的消息处理程序。另一种选择是使用容器的拦截能力。 (structuremap.net/structuremap/Interception.htm 如果您使用的是结构图)。您能否详细说明您在执行命令之前和之后要执行的操作?
      • 感谢安德烈亚斯的这两点。我尝试做的一件事是仅在正确处理的情况下将收到的消息发送到另一个队列。 ForwardReceivedMessages 发送所有消息。似乎为了我的需要,我应该使用容器拦截或我的哑基消息处理程序。
      • 另外我想在消息处理程序中拦截一个异常时刻,以通知另一个队列(尽管 NServiceBus 说不处理错误的事件 - 我认为在许多情况下我们仍然需要处理错误,我们需要确切地知道抛出了什么消息异常......)
      • 博客链接已失效。
      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2012-03-17
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多