Beispiel #1
0
        /// <summary>
        /// 悲观超时
        /// </summary>
        static void PessimisticTimeOutTest()
        {
            CancellationTokenSource userCancellationSource = new CancellationTokenSource();

            ISyncPolicy fallback = Policy.Handle <Polly.Timeout.TimeoutRejectedException>()
                                   .Or <ArgumentException>()
                                   .Fallback(() =>
            {
                Console.WriteLine("Error occured,runing fallback");
            },
                                             (ex) => { Console.WriteLine($"Fallback exception:{ex.GetType().ToString()},Message:{ex.Message}"); });

            ISyncPolicy policyTimeout = Policy.Timeout(3, Polly.Timeout.TimeoutStrategy.Pessimistic);

            while (true)
            {
                var policyWrap = Policy.Wrap(fallback, policyTimeout);

                // (wraps the policies around any executed delegate: fallback outermost ... bulkhead innermost)
                policyWrap.Execute(() =>
                {
                    Console.WriteLine("Job Start");

                    if (DateTime.Now.Second % 2 == 0)
                    {
                        Thread.Sleep(3000);
                        throw new ArgumentException("Hello Polly!");
                    }
                });
                Thread.Sleep(300);
            }
        }
        public void Should_restore_PolicyKey_of_outer_policy_to_execution_context_as_move_outwards_through_PolicyWrap()
        {
            ISyncPolicy fallback = Policy
                                   .Handle <Exception>()
                                   .Fallback(_ => {}, onFallback: (_, context) =>
            {
                context.PolicyWrapKey.Should().Be("PolicyWrap");
                context.PolicyKey.Should().Be("FallbackPolicy");
            })
                                   .WithPolicyKey("FallbackPolicy");

            ISyncPolicy retry = Policy
                                .Handle <Exception>()
                                .Retry(1, onRetry: (result, retryCount, context) =>
            {
                context.PolicyWrapKey.Should().Be("PolicyWrap");
                context.PolicyKey.Should().Be("RetryPolicy");
            })
                                .WithPolicyKey("RetryPolicy");

            ISyncPolicy policyWrap = Policy.Wrap(fallback, retry)
                                     .WithPolicyKey("PolicyWrap");

            policyWrap.Execute(() => throw new Exception());
        }
Beispiel #3
0
 internal static void Implementation(
     Action <Context, CancellationToken> action,
     Context context,
     CancellationToken cancellationToken,
     ISyncPolicy outerPolicy,
     ISyncPolicy innerPolicy)
 => outerPolicy.Execute((ctx, ct) => innerPolicy.Execute(action, ctx, ct), context, cancellationToken);
Beispiel #4
0
        private static void Demo2()
        {
            try
            {
                //ISyncPolicy policy = Policy.Handle<Exception>().WaitAndRetry(new TimeSpan[] { TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(2000) });
                //ISyncPolicy policy = Policy.Handle<Exception>().RetryForever( );
                ISyncPolicy policy = Policy.Handle <Exception>().Retry();
                //RetryForever();
                //Policy.Handle<Exception>().Retry
                //Policy.Handle<Exception>().RetryForever
                //Policy.Handle<Exception>().Fallback
                //Policy.Handle<Exception>().CircuitBreaker
                //Policy.Handle<Exception>().WaitAndRetry
                policy.Execute(() =>
                {
                    Console.WriteLine("开始任务");

                    //if (Environment.TickCount % 2 == 0)
                    if (DateTime.Now.Second % 5 != 0)
                    {
                        throw new Exception("出错");
                    }
                    Console.WriteLine("完成任务");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("未处理异常" + ex);
            }
        }
Beispiel #5
0
        public PolicyFactory()
        {
            PollyPolicy pollyPolicy = GetPollyPolicy();

            this._asyncPolicy = GetAsyncPolicyConfigs(pollyPolicy.Policies);
            this._syncPolicy  = GetSyncPolicyConfigs(pollyPolicy.Policies);
        }
 public static void Wrap()
 {
     try
     {
         ISyncPolicy policyException = Policy.Handle <TimeoutRejectedException>()  //只针对超时异常
                                       .Fallback(() =>
         {
             Console.WriteLine("fallback");
         });
         ISyncPolicy policytimeout = Policy.Timeout(2, Polly.Timeout.TimeoutStrategy.Pessimistic);//乐观和悲观
         //ISyncPolicy policy3 = policyException.Wrap(policytimeout);//
         ISyncPolicy policy3 = Policy.Wrap(policyException, policytimeout);
         policy3.Execute(() =>
         {
             Console.WriteLine("开始任务");
             Thread.Sleep(5000);
             // throw new Exception();
             Console.WriteLine("完成任务");
         });
     }
     catch (Exception ex)
     {
         Console.WriteLine("未处理异常" + ex.GetType() + ":" + ex.Message);
     }
 }
        public static void CircuitBreaker()
        {
            int         i      = 0;
            ISyncPolicy policy = Policy
                                 .Handle <Exception>()
                                 .CircuitBreaker(6, TimeSpan.FromSeconds(5));//连续出错6次之后熔断5秒(不会再去尝试执行业务代码)。

            while (true)
            {
                Console.WriteLine("开始Execute");
                try
                {
                    policy.Execute(() =>
                    {
                        i++;
                        Console.WriteLine("开始任务");
                        if (i < 8)
                        {
                            throw new Exception("出错");
                        }

                        Console.WriteLine("完成任务");
                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine("execute出错" + ex.GetType() + ":" + ex.Message);
                }
                Thread.Sleep(1000);
            }
        }
        private static void Main(string[] args)
        {
            var unstableService = new MrUnstable();

            ISyncPolicy redo1 = Policy.Handle <ApplicationException>()
                                .Retry(1,
                                       (exception, count) =>
            {
                Console.WriteLine($"ApplicationException, exception:{exception.Message}, count:{count}");
            });

            ISyncPolicy benFallback = Policy.Handle <ApplicationException>()
                                      .Fallback(() =>
            {
                Console.WriteLine("Execute Fallback action");
            }, ex =>
            {
                Console.WriteLine($"on fallback, exception message:{ex.Message.ToString()}");
            });

            benFallback.Execute(() =>
            {
                redo1.Execute(() =>
                {
                    unstableService.SpecificException(new ApplicationException());
                });
            });

            Console.Read();
        }
Beispiel #9
0
        public void Should_restore_PolicyKey_of_outer_policy_to_execution_context_as_move_outwards_through_PolicyWrap()
        {
            ISyncPolicy <ResultPrimitive> fallback = Policy <ResultPrimitive>
                                                     .Handle <Exception>()
                                                     .Fallback <ResultPrimitive>(ResultPrimitive.Undefined, onFallback: (_, context) =>
            {
                context.PolicyWrapKey.Should().Be("PolicyWrap");
                context.PolicyKey.Should().Be("FallbackPolicy");
            })
                                                     .WithPolicyKey("FallbackPolicy");

            ISyncPolicy <ResultPrimitive> retry = Policy <ResultPrimitive>
                                                  .Handle <Exception>()
                                                  .Retry(1, onRetry: (_, _, context) =>
            {
                context.PolicyWrapKey.Should().Be("PolicyWrap");
                context.PolicyKey.Should().Be("RetryPolicy");
            })
                                                  .WithPolicyKey("RetryPolicy");

            Policy <ResultPrimitive> policyWrap = Policy.Wrap(fallback, retry)
                                                  .WithPolicyKey("PolicyWrap");

            policyWrap.Execute(() => throw new Exception());
        }
Beispiel #10
0
        public static void RetryDowngrade()
        {
            try
            {
                //降级处理程序
                ISyncPolicy policy = Policy.Handle <Exception>()
                                     .Fallback(() =>
                {
                    Console.WriteLine("降级成功");
                });
                //配置重试次数
                ISyncPolicy policy2 = Policy.Handle <Exception>().Retry(3, (exception, retryCount, context) =>
                {
                    Console.WriteLine(retryCount);
                });
                //合并
                ISyncPolicy mainPolicy = Policy.Wrap(policy, policy2);
                mainPolicy.Execute(() =>
                {
                    Console.WriteLine("任务开始");

                    throw new Exception("出错了");

                    Console.WriteLine("任务结束");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("异常结果 : " + ex.Message);
            }
        }
Beispiel #11
0
        public static void Fusing()
        {
            Action <Exception, TimeSpan> onBreak = (exception, timespan) =>
            {
                Console.WriteLine("1");
            };
            Action onReset = () =>
            {
                Console.WriteLine("2");
            };
            ISyncPolicy policy = Policy.Handle <Exception>().CircuitBreaker(3, TimeSpan.FromSeconds(20), onBreak, onReset);

            while (true)
            {
                try
                {
                    policy.Execute(() =>
                    {
                        Console.WriteLine("任务开始");

                        throw new Exception("出错了");

                        Console.WriteLine("任务结束");
                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine("---------------异常结果-------------- : " + ex.Message + "时间:" + DateTime.Now);
                }
                System.Threading.Thread.Sleep(5000);
            }
        }
Beispiel #12
0
 public PollyQueryHandler(IQueryHandler <TQuery, TResult> handler, ISyncPolicy policy)
 {
     Condition.Requires(handler, nameof(handler)).IsNotNull();
     Condition.Requires(policy, nameof(policy)).IsNotNull();
     this.handler = handler;
     this.policy  = policy;
 }
 protected CrmDatastoreBase(
     ILogger <CrmDatastoreBase <T> > logger,
     ISyncPolicyFactory policy)
 {
     _logger = logger;
     _policy = policy.Build(_logger);
 }
Beispiel #14
0
 public PollyCommandHandler(ICommandHandler <TCommand> handler, ISyncPolicy policy)
 {
     Condition.Requires(handler, nameof(handler)).IsNotNull();
     Condition.Requires(policy, nameof(policy)).IsNotNull();
     this.handler = handler;
     this.policy  = policy;
 }
Beispiel #15
0
        public static void Case1()
        {
            ISyncPolicy policy = Policy.Handle <ArgumentException>()
                                 .Fallback(() =>
            {
                Console.WriteLine("Error occured");
            });

            policy.Execute(() =>
            {
                //try
                //{
                Console.WriteLine("Job Start");
                throw new ArgumentException("sdada");
                var ss = SumNum();


                Console.WriteLine($"Result {ss}");
                //}
                //catch (AggregateException ex)
                //{
                //    Console.WriteLine("我是错误的方法");
                //}
                //finally
                //{
                //    Console.WriteLine("Job End");
                //}
                //throw new ArgumentException("Hello Polly!");
            });
        }
Beispiel #16
0
        /// <summary>
        /// 超时处理
        /// 用途:请求网络接口,避免接口长期没有响应造成系统卡死。
        /// </summary>
        private static void Timeout()
        {
            ISyncPolicy policy = Policy.Handle <Exception>()
                                 .Fallback(() =>
            {
                Console.WriteLine("执行出错");
            }, ex =>
            {
                Console.WriteLine("详细异常对象" + ex);
            });

            policy = policy.Wrap(Policy.Timeout(2, TimeoutStrategy.Pessimistic));

            policy.Execute(() =>
            {
                Console.WriteLine("开始任务");
                Thread.Sleep(5000);
                Console.WriteLine("完成任务");
            });

            //        ISyncPolicy policy = Policy.Handle<TimeoutRejectedException>()
            //.Retry(1);
            //        policy = policy.Wrap(Policy.Timeout(3, TimeoutStrategy.Pessimistic));
            //        policy.Execute(() =>
            //        {
            //            Console.WriteLine("开始任务");
            //            Thread.Sleep(5000);
            //            Console.WriteLine("完成任务");
            //        });
        }
Beispiel #17
0
        public SyncPolicyFactory(IOptions <PolicyOptions> policyOptions)
        {
            policyOptions = Guard.IsNotNull(policyOptions, "policyOptions");
            var val = Policy.Handle((Func <SqlException, bool>)(ex => this.IsTransientSqlException(ex)))
                      .WaitAndRetry(policyOptions.Value.DbRetryCount,
                                    attempt => TimeSpan.FromMilliseconds(policyOptions.Value.DbRetryBaseDelay * attempt));
            var circuitBreakerSqlPolicy = Policy
                                          .Handle((Func <SqlException, bool>)(ex => this.IsTransientSqlException(ex))).CircuitBreaker(
                policyOptions.Value.DbCircuitBreakerErrorCount,
                TimeSpan.FromMilliseconds(policyOptions.Value.DbCircuitBreakerDelay));

            this.dbExecutionSyncPolicy = val.Execute(() => circuitBreakerSqlPolicy);
            var val2 = Policy.Handle <Exception>().WaitAndRetry(policyOptions.Value.ApiRetryCount,
                                                                attempt => TimeSpan.FromMilliseconds(policyOptions.Value.ApiRetryBaseDelay * attempt));
            var circuitBreakerApiPolicy = Policy.Handle <Exception>().CircuitBreaker(
                policyOptions.Value.ApiCircuitBreakerErrorCount,
                TimeSpan.FromMilliseconds(policyOptions.Value.ApiCircuitBreakerDelay));

            this.apiExecutionSyncPolicy = val2.Execute(() => circuitBreakerApiPolicy);
            var val3 = Policy.Handle <IOException>().WaitAndRetry(policyOptions.Value.QueueRetryCount,
                                                                  attempt => TimeSpan.FromMilliseconds(policyOptions.Value.QueueRetryBaseDelay * attempt));
            var circuitBreakerQueuePolicy = Policy.Handle <IOException>().CircuitBreaker(
                policyOptions.Value.QueueCircuitBreakerErrorCount,
                TimeSpan.FromMilliseconds(policyOptions.Value.QueueCircuitBreakerDelay));

            this.queueExecutionSyncPolicy = val3.Execute(() => circuitBreakerQueuePolicy);
            var val4 = Policy.Handle <Exception>().WaitAndRetry(policyOptions.Value.IORetryCount,
                                                                attempt => TimeSpan.FromMilliseconds(policyOptions.Value.IORetryBaseDelay * attempt));
            var circuitBreakerIoPolicy = Policy.Handle <Exception>().CircuitBreaker(
                policyOptions.Value.IOCircuitBreakerErrorCount,
                TimeSpan.FromMilliseconds(policyOptions.Value.IOCircuitBreakerDelay));

            this.ioExecutionSyncPolicy = val4.Execute(() => circuitBreakerIoPolicy);
        }
Beispiel #18
0
        /// <summary>
        /// 重试处理
        /// </summary>
        private static void Retry()
        {
            int i = 0;

            try
            {
                ISyncPolicy policy = Policy.Handle <Exception>()
                                     .RetryForever();//一直重试
                policy.Execute(() =>
                {
                    Console.WriteLine("开始任务" + (++i));
                    if (DateTime.Now.Second % 2 != 0)
                    {
                        throw new Exception("出错");
                    }

                    Console.WriteLine("完成任务");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未处理异常:{ex}");
            }

            //RetryForever()是一直重试直到成功
            //Retry()是重试最多一次;
            //Retry(n)是重试最多n次;
            //WaitAndRetry()可以实现“如果出错等待100ms再试还不行再等150ms秒。。。。”,重载方法很多,一看就懂,不再一一介绍。还有WaitAndRetryForever。
        }
        public static void RetryForever()
        {
            try
            {
                ISyncPolicy policy = Policy.Handle <Exception>()
                                     //.WaitAndRetry(new TimeSpan[] { TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(2000) });
                                     .RetryForever();

                policy.Execute(() =>
                {
                    Console.WriteLine("开始任务");

                    //if (Environment.TickCount % 2 == 0)
                    if (DateTime.Now.Second % 10 != 0)
                    {
                        throw new Exception("出错");
                    }
                    Console.WriteLine("完成任务");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("未处理异常" + ex);
            }
        }
Beispiel #20
0
 /// <summary>
 /// Polly简单使用
 /// </summary>
 private static void SimpleUse()
 {
     try
     {
         ISyncPolicy policy = Policy.Handle <ArgumentException>(ex => ex.Message == "年龄参数错误")
                              .Fallback(() =>
         {
             Console.WriteLine("出错了");
         }, ex =>
         {
             Console.WriteLine("详细异常对象" + ex);
         });
         policy.Execute(() =>
         {
             //这里是可能会产生问题的业务系统代码
             Console.WriteLine("开始任务");
             throw new ArgumentException("年龄参数错误");
             //throw new Exception("haha");
             //Console.WriteLine("完成任务");
         });
     }
     catch (Exception ex)
     {
         Console.WriteLine($"未处理异常:{ex}");
     }
 }
Beispiel #21
0
        public BusinessLogic(ISomeService someService, ISyncPolicy policy)
        {
            _someService = someService;
            _policy      = policy;

            Log.Information("BusinessLogic ctor done");
        }
Beispiel #22
0
        public void Converting_a_nongeneric_ISyncPolicy_to_generic_should_return_a_generic_ISyncPolicyTResult()
        {
            ISyncPolicy nonGenericPolicy = Policy.Timeout(10);
            var         genericPolicy    = nonGenericPolicy.AsPolicy <ResultClass>();

            genericPolicy.Should().BeAssignableTo <ISyncPolicy <ResultClass> >();
        }
Beispiel #23
0
        private ISyncPolicy CreateSyncPolicy(MethodInfo method)
        {
            List <IPolicyConfig> policyConfigs = GetPolicyConfigs(method);
            ISyncPolicy          policy        = GetSyncPolicyConfigs(policyConfigs);

            return(policy);
        }
Beispiel #24
0
 internal static TResult Implementation <TResult>(
     Func <Context, CancellationToken, TResult> func,
     Context context,
     CancellationToken cancellationToken,
     ISyncPolicy <TResult> outerPolicy,
     ISyncPolicy <TResult> innerPolicy)
 => outerPolicy.Execute((ctx, ct) => innerPolicy.Execute(func, ctx, ct), context, cancellationToken);
        public void Should_be_able_fluently_to_configure_the_policy_key_via_interface()
        {
            ISyncPolicy <int> policyAsInterface     = Policy.HandleResult <int>(0).Retry();
            var policyAsInterfaceAfterWithPolicyKey = policyAsInterface.WithPolicyKey(Guid.NewGuid().ToString());

            policyAsInterfaceAfterWithPolicyKey.Should().BeAssignableTo <ISyncPolicy <int> >();
        }
Beispiel #26
0
        public PollyDbCommand(SqlCommand command, IAsyncPolicy[] asyncPolicies, ISyncPolicy[] syncPolicies)
        {
            _sqlCommand = command;
            _sqlCommand.CommandTimeout = 5;

            if (asyncPolicies == null)
            {
                throw new ArgumentNullException($"{nameof(asyncPolicies)} must have at least one async policy provided");
            }

            if (asyncPolicies.Length == 1)
            {
                _asyncSinglePolicy = asyncPolicies[0];
            }
            else
            {
                _asyncPolicyWrapper = Policy.WrapAsync(asyncPolicies);
            }

            if (syncPolicies == null)
            {
                throw new ArgumentNullException($"{nameof(syncPolicies)} must have at least one sync policy provided");
            }

            if (syncPolicies.Length == 1)
            {
                _syncSinglePolicy = syncPolicies[0];
            }
            else
            {
                _syncPolicyWrapper = Policy.Wrap(syncPolicies);
            }
        }
Beispiel #27
0
        static void AdvancedCircuitBreaker()
        {
            Action <Exception, TimeSpan, Context> onBreak = (exception, timespan, context) =>
            {
                Console.WriteLine("onBreak Running,the exception.Message : " + exception.Message);
            };

            Action <Context> onReset = context =>
            {
                Console.WriteLine("Job Back to normal");
            };

            var breaker = Policy.Handle <ArgumentException>()
                          .AdvancedCircuitBreaker(
                failureThreshold: 0.5,                     // Break on >=50% actions result in handled exceptions...
                samplingDuration: TimeSpan.FromSeconds(3), // ... over any 10 second period
                minimumThroughput: 3,                      // ... provided at least 8 actions in the 10 second period.
                durationOfBreak: TimeSpan.FromSeconds(5),  // Break for 30 seconds.
                onBreak: onBreak, onReset: onReset);

            ISyncPolicy policy = Policy.Handle <ArgumentException>()
                                 .WaitAndRetry(new[] { TimeSpan.FromMilliseconds(200),
                                                       TimeSpan.FromMilliseconds(400) }, (ex, timesapn, context) =>
            {
                // Monitor the circuit state, for example for health reporting.
                CircuitState state = breaker.CircuitState;
                Console.WriteLine(state.ToString());

                Console.WriteLine($"Runing Retry,Exception :{ex.Message},timesapn:{timesapn}");
            });

            while (true)
            {
                try
                {
                    var policyWrap = Policy.Wrap(policy, breaker);

                    // (wraps the policies around any executed delegate: fallback outermost ... bulkhead innermost)
                    policyWrap.Execute(() =>
                    {
                        Console.WriteLine("Job Start");

                        if (DateTime.Now.Second % 2 == 0)
                        {
                            throw new ArgumentException("Hello Polly!");
                        }
                    });
                }
                catch (Exception ex)
                {
                    // 手动打开熔断器,阻止执行
                    //breaker.Isolate();
                }
                Thread.Sleep(500);

                // 恢复操作,启动执行
                //breaker.Reset();
            }
        }
Beispiel #28
0
 /// <summary>
 /// Wraps the specified outer policy round the inner policy.
 /// </summary>
 /// <param name="outerPolicy">The outer policy.</param>
 /// <param name="innerPolicy">The inner policy.</param>
 /// <returns>A <see cref="PolicyWrap"/> instance representing the combined wrap.</returns>
 public static PolicyWrap <TResult> Wrap <TResult>(this ISyncPolicy <TResult> outerPolicy, ISyncPolicy <TResult> innerPolicy)
 {
     if (outerPolicy == null)
     {
         throw new ArgumentNullException(nameof(outerPolicy));
     }
     return(((Policy <TResult>)outerPolicy).Wrap(innerPolicy));
 }
 public KafkaConsumerWrapper(IConsumer <string, TPayload> kafkaConsumer, IProducer <string, TPayload> kafkaProducer, ILogger <KafkaConsumerWrapper <TPayload> > logger)
 {
     this.kafkaConsumer           = kafkaConsumer;
     this.kafkaProducer           = kafkaProducer;
     this.logger                  = logger;
     this.cancellationTokenSource = new CancellationTokenSource();
     this.resiliencePolicy        = CreateResiliencePolicy();
 }
Beispiel #30
0
 /// <summary>
 /// Wraps the specified outer policy round the inner policy.
 /// </summary>
 /// <param name="outerPolicy">The outer policy.</param>
 /// <param name="innerPolicy">The inner policy.</param>
 /// <returns>A <see cref="PolicyWrap"/> instance representing the combined wrap.</returns>
 public static PolicyWrap Wrap(this ISyncPolicy outerPolicy, ISyncPolicy innerPolicy)
 {
     if (outerPolicy == null)
     {
         throw new ArgumentNullException(nameof(outerPolicy));
     }
     return(((Policy)outerPolicy).Wrap(innerPolicy));
 }