zoukankan      html  css  js  c++  java
  • Polly简介 — 3. 执行策略

    执行策略

    执行策略的常见方式是调用策略的Execute函数

    var policy = Policy.Handle<TimeoutException>().Retry();
    policy.Execute(DoSomething);

    返回值:

    如果有返回值,它也是可以获取其返回值的:

    var result = policy.Execute(DoSomething);

    捕获异常:

    如果在策略的执行过程中出现了异常,也会在该函数中同步抛出来,和直接执行该委托行为一致。可以直接通过try-catch处理。

    try
    {
        policy.Execute(DoSomething);
    }
    catch (Exception e)
    {
        throw;
    }

    也可以通过ExecuteAndCapture函数捕获异常。

    var result = policy.ExecuteAndCapture(DoSomething);
    if (result.FaultType == null)
    {
        Console.WriteLine(result.Result);
    }

     

    策略上下文

    在策略的处理过程中,有一个上下文对象,可以在回调函数中使用:

    public static RetryPolicy Retry(this PolicyBuilder policyBuilder, int retryCount, Action<ExceptionintContext> onRetry);

    它是一个IDictionary<stringobject>类型的对象,它在Policy的执行过程中都可以使用,如:

    Policy.Handle<TimeoutException>().Retry(3, (err, countDown, context) =>
    {
        var method = context["method"];
        ConsoleLogger.WriteLine(method);
    })

    这个上下文对象可以在应用策略的时候带入:

    policy.Execute(DoSomethingnew Context("context")
    {
        ["method"] = "PolicyTest"
    });

     

    依赖注入

    Polly也自带了一个简单的DI框架,方便复用Policy,使用方式如下:

    var registry = new PolicyRegistry();
    registry.Add("timeout & retry"Policy.Handle<TimeoutException>().Retry(3));

    var policy = registry.Get<ISyncPolicy>("timeout & retry");
    policy.Execute(DoSomething);

    当然,也可以使用Autofac等自己喜欢的方式。

     

    线程安全

    Policy本身是线程安全的,可以并发使用同一个Policy,但如果Policy中执行的委托有多线程问题,仍然会出现异常。

     

    异步的支持

    Policy对异步操作也提供了良好的支持,只需要使用相应以Async结尾的函数即可。

    var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
    await policy.ExecuteAsync(DoSomethingAsync);

    PS:有的不需要(也没有)以Async的函数,如Handle

    同步上下文

    对于有的异常处理,如果需要同步上下文,则需要在ExecuteAsync函数中设置continueOnCapturedContext参数为false。

    var policy = Policy.Handle<TimeoutException>().RetryAsync(3);
    await policy.ExecuteAsync(DoSomethingAsyncCancellationToken.None, continueOnCapturedContext: true);

     

    Cancellation的支持

    Polly也支持系统的co-operative cancellation框架,在重试,超时,bulkhead等策略中通知执行的委托,从而影响其行为。要使用Cancellation,需要在Excute的时候传入CancellationToken。

    policy.Execute(ct =>
    {
        ct.ThrowIfCancellationRequested();
    }, cts.Token);

    具体示例在介绍弹性策略的超时策略时有介绍到。

     

     

  • 相关阅读:
    linux软件名规则
    给php开启mysql扩展
    centos6可用的Apache管理脚本
    Centos下设置redis开机自启动
    拆卸mysql
    如何判断是否在一个网路中
    linux 如何清理僵尸进程
    如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之
    一张图告诉你php的命名空间和自动加载
    PHP的文件加载机制到底是什么目录
  • 原文地址:https://www.cnblogs.com/TianFang/p/8215736.html
Copyright © 2011-2022 走看看