• 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

  • 相关阅读:
    html模板与json数据交互
    利用tempo将json数据填充到html模板
    利用json2html将json数据填充到html模板
    seajs实例
    jQuery用noConflict代替$
    vue-router各个属性的作用及用法
    vue组件级路由钩子函数介绍,及实际应用
    Vue路由scrollBehavior滚动行为控制锚点
    vue当前路由跳转初步研究
    vue路由使用踩坑点:当动态路由再使用路由name去匹配跳转时总是跳转到根路由的问题
  • 原文地址:https://www.cnblogs.com/myfqm/p/14447102.html
Copyright © 2020-2023  润新知