启用二级重试的Rebus在IFailed<T>处理器中无法停止重试问题
Rebus 二级重试与死信队列处理方案
解决10次延迟重试后避免默认快速重试的问题
你不用靠抛出异常触发死信,直接在IFailed处理器里调用Rebus的死信API就能跳过默认的5次快速重试:
- 在
IFailed<TMessage>处理器中,通过failedMessage.ErrorDetails.NumberOfFailedAttempts获取当前重试次数,判断是否已完成10次重试。 - 达到10次上限时,调用
IBus.Advanced.TransportMessage.Deadletter()方法直接将消息送入死信队列,完全绕过默认快速重试流程。
示例代码片段:
public class FailedMessageHandler : IFailed<YourMessageType> { private readonly IBus _bus; public FailedMessageHandler(IBus bus) { _bus = bus; } public async Task Handle(Failed<YourMessageType> failedMessage) { var retryCount = failedMessage.ErrorDetails.NumberOfFailedAttempts; if (retryCount >= 10) { // 直接死信,跳过默认快速重试 await _bus.Advanced.TransportMessage.Deadletter("已完成10次延迟重试,送入死信队列"); return; } // 执行30秒延迟重试 await Task.Delay(TimeSpan.FromSeconds(30)); await _bus.Advanced.Retry(failedMessage.Message); } }
如果想全局调整,也可以在Rebus配置时把默认快速重试次数设为0,但这种方式会影响所有消息处理,不如在特定IFailed处理器里针对性处理灵活。
Fleet Manager 同步问题
只要你的错误队列是Rebus配置的标准死信队列,且Fleet Manager已经监控该队列,手动转发的消息就会同步到Fleet Manager中。Fleet Manager通过监听队列消息变动收集数据,消息进入被监控的错误队列后,会自动被捕获并展示在控制台。
内容的提问来源于stack exchange,提问作者Dosper7
相关产品推荐
相关产品推荐

