当消息被传输到错误队列时,我如何钩入NServiceBus来写入日志文件

本文关键字:NServiceBus 何钩入 文件 日志 传输 消息 错误 队列 | 更新日期: 2023-09-27 18:07:53

我们目前使用自托管的NServiceBus来处理系统中的可排队消息。现在,在某些情况下,排队的消息可能在第一次尝试时失败,并在自动重试时工作。

现在我们正在记录所有的失败,但我们真的不关心(至少对于警报),如果消息第一次失败,但正在重新尝试。我们真正想要得到警报的是,如果所有重试失败,消息进入错误队列。

是否有任何方式原生到NServiceBus有代码运行时,它的消息移动到错误队列?

当消息被传输到错误队列时,我如何钩入NServiceBus来写入日志文件

如果您正在使用服务平台的其余部分(并且您应该!),这意味着您的错误队列将有ServiceControl位于其顶部,从错误中读取消息并审计并将详细信息持久化到其数据库中,以便它可以通过其rest API将该信息提供给ServicePulse(用于监视系统运行状况和正常运行时间)和ServiceInsight(用于探索和调试)。

假设您正在使用ServiceControl,那么让端点订阅由ServiceControl发布的MessageFailed事件是非常容易的。我在我的博客文章中解释了如何使用ServiceControl进行失败消息通知。

通过这种方式,每个端点不必负责此任务,并且由集中的错误监视端点异步完成。

正确的方法似乎是创建IManageMessageFailures的自定义实现,并在配置时注册自定义故障管理器。

一个例子是:

public class CustomFaultManager : IManageMessageFailures
{
    private readonly IManageMessageFailures faultManager;
    static CustomFaultManager()
    {
        Configure.Instance.MessageForwardingInCaseOfFault();
    }
    public CustomFaultManager()
    {
        faultManager = new FaultManager();
        ((FaultManager)faultManager).ErrorQueue = ConfigureFaultsForwarder.ErrorQueue;
    }
    void IManageMessageFailures.SerializationFailedForMessage(TransportMessage message, Exception e)
    {
        faultManager.SerializationFailedForMessage(message, e);
    }
    void IManageMessageFailures.ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e)
    {
        faultManager.ProcessingAlwaysFailsForMessage(message, e);
        //Custom code goes here
    }
    void IManageMessageFailures.Init(Address address)
    {
        faultManager.Init(address);
    }
}
从https://github.com/Particular/NServiceBus/issues/463