Polly 重试机制
引用 Install-Package Microsoft.Extensions.Http.Polly
在Core中的使用
方式一:先配置再执行
public readonly AsyncRetryPolicy _httpRequestPolicy; public PollyController() { _httpRequestPolicy = Policy .Handle<HttpRequestException>() .RetryAsync() } public async Task<ActionResult> Test() { HttpResponseMessage httpResponse = await _httpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync("https://XXX")); }
注意:
执行 ExecuteAsync 方法,异常会抛出
执行 ExecuteAndCapture 方法,异常被捕获,不会被抛出 参考地址:ExecuteAndCapture
方式二:边配置边执行
result = await Policy .Handle<CustomException>(ex => ex.Code == 404) .RetryAsync( 3, async (ex, Index) => { //重试前执行方法,如日志 } ) .ExecuteAsync(() => TestGetString()); //这里可以对方法进行重试
方式三:在Startup.cs中配置
services.AddHttpClient("Retry") .AddPolicyHandler(Policy<HttpResponseMessage> .Handle<Exception>() .RetryAsync( 3, (ex, Index) => { //执行前方法 } ) );
重试配置
配置处理异常(对异常进行重试)
单个异常
Policy .Handle<Exception>() //处理单个异常
自定义异常
.Handle<CustomException>() //处理单个自定义异常
自定义异常带条件
.Handle<CustomException>(ex => ex.Code == 404) //处理单个自定义异常带条件
多个异常
.Handle<CustomException>(ex => ex.Code == 404) //处理单个自定义异常带条件 .Or<Exception>() //处理多个异常
配置处理结果(对结果进行重试)
单个结果
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound) //处理结果,带条件
多个结果
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound) //处理结果,带条件 .OrResult(r => r.StatusCode == HttpStatusCode.BadGateway) //处理多个结果,带条件
配置重试
有限重试
.RetryAsync( //有限重试 3, //重试总次数 onRetry: (ex, retryCount) => { //重试前执行的方法 ex //捕获的异常信息 retryCount //当前重试次数 } )
无限重试
.RetryForeverAsync( //无限重试 onRetry: ex => { //重试前执行的方法 ex //捕获的异常信息 } )
等待时间重试
.WaitAndRetryAsync( //等待指定时间再重试 3, //重试总次数 waitTime => TimeSpan.FromSeconds(2), //等待时间 onRetry: (ex, ts, context) => { //重试前执行的方法 } )
无限重试,等待时间
.WaitAndRetryForeverAsync( //无限重试,等待时间再重试 waitTime => TimeSpan.FromSeconds(2), //等待时间 onRetry: (ex, ts, context) => { //重试前执行的方法 } )
参考资料: