Polly WaitAndRetryAsync重试失效求助:第二个生产者无重试
Polly重试策略异常排查:第二个Service Bus生产者不触发重试
我是Polly库新手,尝试用该库在Service Bus连接失败时实现重试逻辑,使用WaitAndRetryAsync按指定间隔多次重试。现有两个基于MediatR事件的生产者连接Service Bus:第一个生产者在连接方法抛出异常时,WaitAndRetryAsync能正常触发重试;但第二个生产者调用相同连接方法并抛出相同异常时,断点能进入Handle<Exception>逻辑,却从未触发WaitAndRetryAsync。请指导排查问题。
相关代码
重试策略定义
private readonly AsyncRetryPolicy<IConnection> _connectionRetryPolicy;
构造函数初始化
_connectionRetryPolicy = CreateConnectionRetryPolicy(recoveryPolicy);
策略创建方法
private AsyncRetryPolicy<IConnection> CreateConnectionRetryPolicy(IRecoveryPolicy recoveryPolicy) { return Policy<IConnection> .Handle<Exception>(exceptionPredicate: exception => { Console.WriteLine(exception); return true; }) .WaitAndRetryAsync(recoveryPolicy.RetryCount, (retryAttempt, context) => { context.SetRetryCount(retryAttempt); return recoveryPolicy.GetDelay(retryAttempt); }, (result, _, context) => { var retryCount = context.GetRetryCount(); var endpoint = context.GetEndpoint(); }); }
执行逻辑
private Task<IConnection> CreateConnection(CancellationToken cancellationToken = default) { var ctx = new Context(); ctx.SetRetryCount(0); return _connectionRetryPolicy.ExecuteAsync(async (context, ct) => { var connection = await CreateConnectionAsync(endpoint, ct); return connection; }, ctx, cancellationToken); }
排查方向
- 检查策略实例与配置:确认两个生产者是否使用独立的
_connectionRetryPolicy实例,或共享实例时recoveryPolicy.RetryCount在第二个生产者调用时是否为0(0次重试会直接跳过)。 - Context对象状态:虽然每次
CreateConnection都新建Context,但要排查MediatR事件处理中是否存在上下文复用、并发修改的情况,导致重试计数异常。 - 异常捕获验证:在
Handle<Exception>的lambda中打印异常类型、堆栈信息,对比两个生产者抛出的异常是否完全一致,确认没有特殊异常被意外过滤。 - CancellationToken有效性:检查第二个生产者调用
CreateConnection时传入的CancellationToken是否已被取消,Polly会在token取消时终止重试流程。 - 线程与并发环境:确认两个生产者的MediatR事件处理线程环境是否存在差异,比如是否有同步上下文导致策略执行逻辑异常。
- Polly版本问题:检查当前使用的Polly版本是否存在并发重试相关的已知bug,尝试升级到最新稳定版验证。
内容的提问来源于stack exchange,提问作者V R
相关产品推荐
相关产品推荐

