【问题标题】:How to disable sending failed messages to the error queue for NServiceBus?如何禁用将失败消息发送到 NServiceBus 的错误队列?
【发布时间】:2016-05-17 02:38:50
【问题描述】:

有没有办法禁止将失败的消息发送到 NServiceBus 的错误队列?

对于一个特定的端点,我不想在第二级重试失败后重试消息。相反,我将使用此处提到的 MessageSentToErrorQueue 错误通知将这些消息挂钩到自定义错误处理解决方案中:Is there a global exception handler for NServiceBus?

如果我省略 MessageForwardingInCaseOfFaultConfig 设置,NSB 将抛出异常。

我可以将它们发送到不受监控的错误队列(表)并定期清除它,但如果可能的话我宁愿不这样做。

也许我也可以将 TimeToBeReceived 设置为比 SecondLevel Retries 短,但这似乎也不适合。

我正在使用 NSB 版本 5.2.14 和 SQL 服务器传输 2.2.3。

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    这将丢弃所有消息

    BusConfiguration configuration = new BusConfiguration();
    configuration.DiscardFailedMessagesInsteadOfSendingToErrorQueue();
    

    不幸的是,您仍然需要指定一个错误队列,否则将不会创建端点实例。但我只是测试了它,甚至没有创建错误队列。不幸的是,该事件也没有触发。

    选项 2:Take a lookIManageMessageFailures。 NServiceBus repo 中有测试,但这不是我们支持的场景。

    选项 3:实现行为 as described here。我没有对此进行测试,认为它有点不稳定,但是当它们被发送到错误队列和abort pipeline execution 时会捕获消息。

    但是

    请注意,我们付出了很多努力来确保消息被传递,甚至传递到错误队列。所以要非常确定你想要构建自己的解决方案并覆盖错误队列。我强烈建议自己阅读错误队列,处理消息,然后对它们做任何你想做的事情。您可以使用 NServiceBus 创建另一个端点,该端点来自错误队列。这就是我们使用 ServiceControl 所做的。

    注意:如果您使用 ServiceControl 和/或错误队列进行常规处理,您应该为此端点指定不同的错误队列,以便来自此端点的错误消息不会与您的常规错误消息处理混在一起。

    【讨论】:

    • 嗯,刚刚有一个灵感,MessageSentToErrorQueue 可能不会因为设置而被解雇,实际上它不会。它确实会触发MessageHasFailedAFirstLevelRetryAttempt 多次,但这可能无济于事。
    • 您确定不能将所有失败的消息发送到错误队列并从那里处理它们吗?
    • 我想我可以发送到一个单独的错误队列(我们确实将 ServiceControl 用于其他端点)并进行处理。所以我需要设置一个额外的端点并将我当前端点的错误队列指向那个新的错误处理端点的输入队列?
    • 是的,看看 ServiceControl 我们是如何做到的,也许它会有所帮助。 github.com/Particular/servicecontrol
    • 注意:DiscardFailedMessagesInsteadOfSendingToErrorQueue 在 NSB 6 中已过时:github.com/Particular/NServiceBus/commit/…。您现在必须创建一个新的错误行为:docs.particular.net/nservicebus/pipeline/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多