发生非暂时性错误时,MassTransit 绕过重试策略
MassTransit bypass retry policy when non transient error occurs
针对非暂时性错误的短路重试策略的指导是什么。
场景。
使用附加到 RabbitMq 的 MassTransit v3。
一个简单的重试策略尝试在管道中设置 5 次。
在消息的 Consume 中,发生不可恢复的错误,而不是抛出异常并重试另外 4 次我想将此消息移至错误队列。
您可以使用:
Retry.Except<BadException>().Immediate(5);
出于某种原因,Chris 的解决方案对我不起作用。也许我是在错误的背景下打这个电话的。唯一有用的是进行两次 UseRetry 调用:
configurator.ReceiveEndpoint(host, _config.QueueName, ec =>
{
...
// Configure retries to immediately fail on permanent consumer faults
ec.UseRetry(r => r.None().Handle<ConsumerPermanentFaultException>());
// Configure all other retries as incremental
ec.UseRetry(r =>
{
r.Incremental(_config.RetryCount, _config.RetryInterval, _config.RetryIntervalIncrement)
.Ignore<ConsumerPermanentFaultException>();
});
// Load consumers from the container
ec.LoadFrom(consumerContainer);
});
针对非暂时性错误的短路重试策略的指导是什么。
场景。
使用附加到 RabbitMq 的 MassTransit v3。 一个简单的重试策略尝试在管道中设置 5 次。 在消息的 Consume 中,发生不可恢复的错误,而不是抛出异常并重试另外 4 次我想将此消息移至错误队列。
您可以使用:
Retry.Except<BadException>().Immediate(5);
出于某种原因,Chris 的解决方案对我不起作用。也许我是在错误的背景下打这个电话的。唯一有用的是进行两次 UseRetry 调用:
configurator.ReceiveEndpoint(host, _config.QueueName, ec =>
{
...
// Configure retries to immediately fail on permanent consumer faults
ec.UseRetry(r => r.None().Handle<ConsumerPermanentFaultException>());
// Configure all other retries as incremental
ec.UseRetry(r =>
{
r.Incremental(_config.RetryCount, _config.RetryInterval, _config.RetryIntervalIncrement)
.Ignore<ConsumerPermanentFaultException>();
});
// Load consumers from the container
ec.LoadFrom(consumerContainer);
});