我有一个使用以下订阅抛出异常和总线的消费者:
ServiceBusFactory.New(sbc=>{
... removed for brevity...
sbc.Subscribe(s=>{
... removed for brevity...
var logger = LogManager.GetLogger("Faults");
s.Handler<IFault>(fault => logger.Error(JsonConvert.SerializeObject(fault)));
}
}
当一个异常被抛出5次并且它继续发生故障时,我可以看到我的处理程序在两个不同的线程中被调用两次。
我不知道为什么,我希望它只发生一次。
也许我会以错误的方式解决这个问题。我希望能够记录发生的故障并能够重新处理它们。是否已经内置了MassTransit或RabbitMQ来处理这个问题?最初我使用MSMQ并自动将故障消息丢弃到相关的_error队列中,但我没有看到使用RabbitMQ的队列。
答案 0 :(得分:2)
我已确认,如Gist所示:
https://gist.github.com/phatboyg/8428147
故障事件仅在消费者连续五次失败后才发布一次。这是使用RabbitMQ或MSMQ从NuGet获得的MT 2.9.5。
答案 1 :(得分:1)
我不知道有关此报道的问题。我会努力将其重现为一个简单的案例,并将其带到邮件列表http://groups.google.com/group/masstransit-discuss或提交问题https://github.com/MassTransit/MassTransit/issues?state=open以及可重现的案例。
答案 2 :(得分:0)
我相信我发现了问题...早期尝试记录错误意味着为每个特定的故障类型而不是IFault对象注册处理程序。其中一些交易所仍在RabbitMQ注册。删除那些解决了问题。