【问题标题】:NServiceBus, how do you do an action before a message is sent to the error queue?NServiceBus,在将消息发送到错误队列之前如何执行操作?
【发布时间】:2018-07-02 18:54:00
【问题描述】:

我正在使用 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

【问题讨论】:

  • 我正在尝试使用 7.1 版做同样的事情。我已经看到了这些行为,但它们似乎在初始调用和每次重试之后运行......而不是在所有重试都用尽之后,这是我需要做的。这个链接说它将在所有重试后被调用,但它似乎并没有像这样执行:“这个新行为已注册,以便在 NServiceBus 调用可恢复性机制后调用它。这包括二级重试,如果它们是启用。” docs.particular.net/nservicebus/pipeline/…
  • @ManOfSteele:感谢您的信息。我认为唯一的方法是自己实现延迟重试逻辑:D

标签: c# rabbitmq nservicebus


【解决方案1】:

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

请参阅以下传奇示例:

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

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

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

【讨论】:

  • 我只需要处理网络问题等暂时性错误。但是我只想在将失败事件静默发送到错误队列之前将其发布到其他服务。
  • 您能否详细说明为什么需要这样做?
  • 我创建了一个处理事件的端点。在事件处理程序中,它将连接到一些 Web 服务以获取数据,然后执行一些计算逻辑,然后将结果上传回 Web 服务。如果一切正常,我将发布一个成功的事件。如果没有,我希望它重试 2,3 次。如果重试后仍然无法正常工作,则会发布失败事件。
  • 传奇超时不适合你吗?我添加了有关传奇超时的信息。 Sagas 通常用于此类集成以采取替代行动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多