丢弃来自 nServiceBus 修改器的消息

Discard message from nServiceBus mutator

如果存在特定 header,我需要丢弃消息。

我尝试在 MutateIncoming 中实现 IMutateTransportMessages 并调用 DoNotContinueDispatchingCurrentMessageToHandlers() 方法,但无论如何消息都会被发送到处理程序。

我可以使用处理程序丢弃消息,但我不喜欢它,因为我还需要指定处理程序的顺序。

有什么解决办法吗?

谢谢, 费德里科

我认为消息修改器不可能做到这一点。毕竟,这并不是真正的 activity 消息修改器应该做的事情——它与更改消息结构无关。

我同意你的看法,在处理程序中执行此操作听起来很麻烦,因为你是对的 - 那么你非常依赖处理程序的顺序。

由于 header 的存在(或不存在)而丢弃消息是一个基础设施问题,并且由于您使用的是 NServiceBus V5,自定义基础设施的最佳方法是自定义消息处理管道.

这里是 the relevant documentation that covers creating a behavior and inserting it into the pipeline 但这是简短的版本:

  1. 您需要创建一个实现 IBehavior<IncomingContext> 的行为。所有行为共同形成一个行为链,通过调用 next() - 实现中存在的 Action 方法进入下一步。
  2. 在行为中,检查您的 header。要停止处理消息,只需不调用 next() 而是调用 context.DoNotInvokeAnyMoreHandlers()
  3. 创建一个 class 继承 RegisterStep ,它将从其构造函数中定义在管道中的何处插入您的行为。您可以在 MutateIncomingTransportMessage 步骤之前注册它。
  4. 创建一个 class 实现 INeedInitialization(请注意,这可能与 RegisterStep class 相同)调用 busConfig.Pipeline.Register<TClassThatInheritsRegisterStep>().

同样,这是简短版本。查看 docs 了解完整故事和示例。

无耻外挂:这个过程在第7章Learning NServiceBus - Second Edition中也有详细描述,有例子。