当消息传输到错误队列时,如何挂钩到NServiceBus以写入日志文件?

时间:2014-06-10 15:41:48

标签: c# nservicebus

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

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

当NServiceBus将消息移动到错误队列时,是否有任何原生代码可以运行代码?

2 个答案:

答案 0 :(得分:2)

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

假设您正在使用ServiceControl,让端点订阅ServiceControl发布的MessageFailed事件非常容易。我在我的博文Failed Message Notification with ServiceControl中解释了如何做到这一点。

这样,每个端点都不必负责此任务,并且由集中式错误监控端点异步完成。

答案 1 :(得分:1)

执行此操作的正确方法似乎是创建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