NServicesBus 完全禁用特定异常的 FLR
NServicesBus disable FLR for specific exceptions completely
我正在尝试完全禁用某些特定异常的重试。
我知道在我的代码中 - 当我尝试处理消息 X 并且如果处理程序抛出 "ZZZ" 类型异常时,我确信任何次数的重试都无济于事;
我想做的是立即将该消息直接发送到错误队列,无需重试。
我该怎么做?
第一关不能重试,只能重试second level retries。我个人不会担心它(我有类似的东西,我知道某些例外情况不会被修复)。让他们进入 FLR 通常没有坏处。
我知道你已经接受了一个答案,但由于你试图绕过针对特定场景的管道内置,你可以在 try/catch 中处理消息并将消息直接发送到错误队列或让 FLR/SLR 处理它。
请注意,这不是理想的场景。在大多数情况下,主动不鼓励处理消息的错误处理,而是让基础架构来管理它。
这是一个可能的实现:
public void Handle(SomeCommand message)
{
try
{
//Do thing that might throw exception
}
catch (SpecificException ex)
{
_bus.Send(new Address("errorQueue", "machine"), message);
}
catch (Exception ex)
{
throw ex;
}
}
编辑 我正在推动将 Marcin 的评论包含在这个答案中,这样就不会错过:
Please bear in mind that by using this approach without setting
appropriate message headers you will lose the ability to return these
failed messages to the source queue. Please take a look at this doco
for details: http://docs.particular.net/nservicebus/messaging/headers#retries-handling-headers. – Marcin
Hoppe
我正在尝试完全禁用某些特定异常的重试。
我知道在我的代码中 - 当我尝试处理消息 X 并且如果处理程序抛出 "ZZZ" 类型异常时,我确信任何次数的重试都无济于事;
我想做的是立即将该消息直接发送到错误队列,无需重试。
我该怎么做?
第一关不能重试,只能重试second level retries。我个人不会担心它(我有类似的东西,我知道某些例外情况不会被修复)。让他们进入 FLR 通常没有坏处。
我知道你已经接受了一个答案,但由于你试图绕过针对特定场景的管道内置,你可以在 try/catch 中处理消息并将消息直接发送到错误队列或让 FLR/SLR 处理它。
请注意,这不是理想的场景。在大多数情况下,主动不鼓励处理消息的错误处理,而是让基础架构来管理它。
这是一个可能的实现:
public void Handle(SomeCommand message)
{
try
{
//Do thing that might throw exception
}
catch (SpecificException ex)
{
_bus.Send(new Address("errorQueue", "machine"), message);
}
catch (Exception ex)
{
throw ex;
}
}
编辑 我正在推动将 Marcin 的评论包含在这个答案中,这样就不会错过:
Please bear in mind that by using this approach without setting appropriate message headers you will lose the ability to return these failed messages to the source queue. Please take a look at this doco for details: http://docs.particular.net/nservicebus/messaging/headers#retries-handling-headers. – Marcin Hoppe