我们目前正在使用自托管NServiceBus来处理系统中的可排队消息。现在有些情况下,排队的消息可能会在第一次尝试时失败并处理自动重试。
现在我们正在记录所有故障,但是如果第一次消息失败但是重新尝试,我们真的不在乎(至少对于警报)。我们想要得到警告的是,如果所有重试都失败并且消息进入错误队列。
当NServiceBus将消息移动到错误队列时,是否有任何原生代码可以运行代码?
答案 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);
}
}