当消息被传输到错误队列时,我如何钩入NServiceBus来写入日志文件
本文关键字:NServiceBus 何钩入 文件 日志 传输 消息 错误 队列 | 更新日期: 2023-09-27 18:07:53
我们目前使用自托管的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