首页 > 解决方案 > NServiceBus,在将消息发送到错误队列之前如何执行操作?

问题描述

我正在使用 NService 创建端点。

端点正在监听事件并进行一些计算,然后将结果(成功或失败)发布到其他端点

我知道 NServiceBus 支持 ImmediateRetry 和 DelayRetry,它们是可配置的。

现在,我想在所有重试之后(在发送到错误队列之前)将失败结果事件发布到其他端点。

public async Task Handle(MyEvent message, IMessageHandlerContext context)
        {
            Console.WriteLine($"Received MyEvent, ID = {message.Id}");

            //Connect to other services to get data and do some calculation
            Thread.Sleep(1000);            


            Console.WriteLine($"Processed MyEvent, ID = { message.Id}");


            await context.Publish(new MyEventResult { IsSucceed = true });
        }

以上是我当前的代码。如果没有异常抛出,它将发布成功的结果。但是如果它有一个致命的异常,我不知道如何在消息发送到错误队列之前发布一个失败结果事件。

提前致谢。

注意:我正在使用 NServiceBus 6.4.3

标签: c#rabbitmqnservicebus

解决方案


我不确定你为什么想要这个,但你看过 NServiceBus sagas 吗?它们旨在在必须通过(外部)服务进行阻塞 IO 时使用。如果在分配的时间段内未执行特定任务或由于返回的结果不正确,您可以根据事实采取替代操作。

请参阅以下 saga 示例:

下面是一个示例,展示了 saga 超时的用法。如果在特定持续时间内未执行特定任务,则可以执行替代操作,例如发布事件或执行ReplyToOriginator

通过使用 sagas,您可以明确您的流程。我会避免为此使用恢复机制。

恢复机制旨在处理网络连接问题、数据库死锁等瞬时错误,但不处理预期的故障结果。您应该正确处理这些并在其不愉快的路径中继续您的建模过程。


推荐阅读