使用Polly重试策略时如何在首次执行和每次重试时调用指定方法
问题原因说明
你当前代码里FirstAndRetryMethod放在WaitAndRetry的onRetry回调中,这个回调仅在触发重试规则、等待下一次执行前才会调用,首次执行没有触发故障的话自然不会运行。
解决方案
方案1:直接在执行委托内前置调用(最推荐,实现最简单)
把FirstAndRetryMethod的调用放到Execute委托的最开头,这样首次执行、每次重试后的重新执行都会先触发该方法,完全符合需求。
另外注意你原有代码有两个小问题:
Excecute拼写错误,正确写法是ExecuteExecute方法返回的是DoSomething的执行结果,不能赋值给原来的policy变量,两者类型不匹配
修正后的完整代码如下:
var policy = Policy .Handle<DatabaseException>(x => x.DatabaseErrors.ContainsKey(2601)) .WaitAndRetry(new[] { TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1500) }, (exception, timeSpan) => { // 这里可以保留重试专属逻辑,比如打印异常日志、统计重试次数等 }); // 如果DoSomething有返回值,用对应类型的变量接收即可 policy.Execute(() => { FirstAndRetryMethod(); DoSomething(); });
方案2:绑定到策略中复用
如果你需要在多个地方复用这个「执行前先调用FirstAndRetryMethod」的逻辑,不想每次写Execute都手动加,可以封装统一的执行逻辑:
// 定义重试策略 var retryPolicy = Policy .Handle<DatabaseException>(x => x.DatabaseErrors.ContainsKey(2601)) .WaitAndRetry(new[] { TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1500) }); // 封装带前置调用的执行逻辑,可全局复用 void ExecuteWithPreprocess(Action action) { retryPolicy.Execute(() => { FirstAndRetryMethod(); action(); }); } // 调用时直接传入业务方法即可 ExecuteWithPreprocess(DoSomething);
内容的提问来源于stack exchange,提问作者Ivan-Mark Debono
相关产品推荐
相关产品推荐

