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) =>
        {
            //重试前执行的方法
        }
    )

 

 

 

 参考资料:

https://github.com/App-vNext/Polly

posted @ 2021-02-25 15:16  delafqm  阅读(614)  评论(0编辑  收藏  举报