zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    学习shell脚本
    Python 3.3.2 round函数并非"四舍五入"
    Python 通过继承实现标准对象的子类
    Python 继承标准类时发生了什么
    Python 表示无穷大的数
    用Python最原始的函数模拟eval函数的浮点数运算功能(2)
    Python 函数参数*expression 之后为什么只能跟关键字参数
    RE模块疑问
    用Python最原始的函数模拟eval函数的浮点数运算功能
    Python 好用得让人发指的函数参数语法糖
  • 原文地址:https://www.cnblogs.com/myfqm/p/14447102.html
Copyright © 2011-2022 走看看