NServiceBus,如何在将消息发送到错误队列之前执行操作?

时间:2018-07-02 18:54:01

标签: c# rabbitmq nservicebus

我正在使用NService创建端点。

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

我知道NServiceBus支持InstantRetry和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

1 个答案:

答案 0 :(得分:0)

我不确定为什么要这样做,但是您是否看过NServiceBus sagas?它们旨在在必须通过(外部)服务进行阻塞IO时使用。如果在分配的时间内未执行特定任务,或者因为返回的结果不正确,则可以根据事实采取其他措施。

请参见以下传奇故事示例:

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

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

恢复机制旨在处理瞬态错误,例如网络连接问题,数据库死锁等,但不处理预期的失败结果。您应该适当地处理这些问题,并沿着其不愉快的道路继续进行建模。