.NetCore中结合ExceptionLess的处理对Polly再次封装
/// <summary> /// Polly封装 liyouming /// </summary> public class PollyServicesFactory { private IELLog eLLog; public PollyServicesFactory(IELLog ellog) { eLLog = ellog; } #region 重试 /// <summary> /// 组合使用Warp /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="num"></param> /// <returns></returns> public ISyncPolicy RetryWarp<TException>(int num) where TException : Exception { var policy = Policy .Handle<TException>() .Retry(num, (ex, count) => { eLLog.AddSource($"[Polly]") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetry") .AddSubmitWarn(); }); return policy; } public IAsyncPolicy RetryWarpAsync<TException>(int num) where TException : Exception { var policy = Policy .Handle<TException>() .RetryAsync(num, (ex, count) => { eLLog.AddSource($"[Polly]") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetry") .AddSubmitWarn(); }); return policy; } /// <summary> /// 服务重试 及重试次数 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="num"></param> public void PollyRetry<TException>(Action action, int num) where TException : Exception { var policy = Policy .Handle<TException>() .Retry(num, (ex, count) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetry") .AddTag(action.Method.Name) .AddSubmitWarn(); }); policy.Execute(action); } public TResult PollyResultRetry<TException, TResult>(Func<TResult> action, int num) where TException : Exception { var policy = Policy .Handle<TException>() .Retry(num, (ex, count) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetry") .AddTag(action.Method.Name) .AddSubmitWarn(); }); return policy.Execute(action); } /// <summary> /// 服务重试 及重试次数 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="num"></param> public async Task PollyRetryAsync<TException>(Func<Task> action, int num) where TException : Exception { var policy = Policy .Handle<TException>() .RetryAsync(num, (ex, count) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetryAsync") .AddTag(action.Method.Name) .AddSubmitWarn(); }); await policy.ExecuteAsync(action); } public async Task<TResult> PollyResultRetryAsync<TException, TResult>(Func<Task<TResult>> action, int num) where TException : Exception { var policy = Policy .Handle<TException>() .RetryAsync(num, (ex, count) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"执行失败!重试次数 {count}\r\n异常来自 {ex.GetType().Name}") .AddTag("PollyRetryAsync") .AddTag(action.Method.Name) .AddSubmitWarn(); }); return await policy.ExecuteAsync(action); } #endregion #region 重试 TimeSpan /// <summary> /// 重试 Warp /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="timeSpans"></param> /// <returns></returns> public ISyncPolicy WaitAndRetryWarp<TException>(params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetry(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]") .AddMessage($"异常: {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetry") .AddSubmitWarn(); }); return policy; } public IAsyncPolicy WaitAndRetryWarpAsync<TException>(params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetryAsync(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]") .AddMessage($"异常: {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetry") .AddSubmitWarn(); }); return policy; } /// <summary> /// 按需要的周期重试 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="timeSpans"></param> /// <returns></returns> public void PollyWaitAndRetry<TException>(Action action, params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetry(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetry") .AddTag(action.Method.Name) .AddSubmitWarn(); }); policy.Execute(action); } public TResult PollyResultWaitAndRetry<TException, TResult>(Func<TResult> action, params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetry(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetry") .AddTag(action.Method.Name) .AddSubmitWarn(); }); return policy.Execute(action); } /// <summary> /// 按需要的周期重试 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="timeSpans"></param> /// <returns></returns> public async Task PollyWaitAndRetryAsync<TException>(Func<Task> action, params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetryAsync(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetryAsync") .AddTag(action.Method.Name) .AddSubmitWarn(); }); await policy.ExecuteAsync(action); } public async Task<TResult> PollyResultWaitAndRetryAsync<TException, TResult>(Func<Task<TResult>> action, params TimeSpan[] timeSpans) where TException : Exception { var policy = Policy .Handle<TException>() .WaitAndRetryAsync(timeSpans, (e, tiempo, intento, contexto) => { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常:{e.Message} {intento:00} (调用秒数: {tiempo.Seconds} 秒)\t执行时间: {DateTime.Now}") .AddTag("WaitAndRetryAsync") .AddTag(action.Method.Name) .AddSubmitWarn(); }); return await policy.ExecuteAsync(action); } #endregion #region 指定特定返回值 public ISyncPolicy<OperatorResult> FallBackWarp<TException>() where TException : Exception { var pollyfallback = Policy<OperatorResult>.Handle<TException>() .Fallback(new OperatorResult { Result = ResultType.Fail, Message = "执行失败" }); return pollyfallback; } public IAsyncPolicy<OperatorResult> FallBackWarpAsync<TException>() where TException : Exception { var pollyfallback = Policy<OperatorResult>.Handle<TException>() .FallbackAsync(new OperatorResult { Result = ResultType.Fail, Message = "执行失败" }); return pollyfallback; } /// <summary> /// 监控特定错误指定返回值 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <returns></returns> public OperatorResult PollyFallBack<TException>(Func<OperatorResult> action) where TException : Exception { var pollyfallback = Policy<OperatorResult>.Handle<TException>() .Fallback(() => { return new OperatorResult { Result = ResultType.Fail, Message = action.Method.Name + "执行失败" }; }); return pollyfallback.Execute(action); } /// <summary> /// 监控特定错误指定返回值 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <returns></returns> public async Task<OperatorResult> PollyFallBackAsync<TException>(Func<Task<OperatorResult>> action) where TException : Exception { var pollyfallback = Policy<OperatorResult>.Handle<TException>() .FallbackAsync(new OperatorResult { Result = ResultType.Fail, Message = action.Method.Name + "执行失败" } ); return await pollyfallback.ExecuteAsync(action); } #endregion #region 熔断 public ISyncPolicy CircuitBreakerWarp<TException>(int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreaker(num, timeSpan); return policy; } public IAsyncPolicy CircuitBreakerWarpAsync<TException>(int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreakerAsync(num, timeSpan); return policy; } /// <summary> /// 熔断 仓壁隔离 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="num"></param> /// <param name="timeSpan"></param> public void PollyCircuitBreaker<TException>(Action action, int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreaker(num, timeSpan); while (true) { try { policy.Execute(action); } catch (Exception ex) { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {ex.Message} \t执行时间: {DateTime.Now}") .AddTag("PollyCircuitBreaker") .AddTag(action.Method.Name) .AddSubmitWarn(); } Thread.Sleep(100); } } public Task<TResult> PollyResultCircuitBreaker<TException, TResult>(Func<Task<TResult>> action, int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreaker(num, timeSpan); while (true) { try { return policy.Execute(action); } catch (Exception ex) { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {ex.Message} \t执行时间: {DateTime.Now}") .AddTag("PollyCircuitBreaker") .AddTag(action.Method.Name) .AddSubmitWarn(); } Thread.Sleep(100); } } /// <summary> /// 熔断 仓壁隔离 /// </summary> /// <typeparam name="TException"></typeparam> /// <param name="action"></param> /// <param name="num"></param> /// <param name="timeSpan"></param> public async Task PollyCircuitBreakerAsync<TException>(Func<Task> action, int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreakerAsync(num, timeSpan); while (true) { try { await policy.ExecuteAsync(action); } catch (Exception ex) { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {ex.Message} \t执行时间: {DateTime.Now}") .AddTag("PollyCircuitBreaker") .AddTag(action.Method.Name) .AddSubmitWarn(); } Thread.Sleep(100); } } public async Task<TResult> PollyResultCircuitBreakerAsync<TException, TResult>(Func<Task<TResult>> action, int num, TimeSpan timeSpan) where TException : Exception { var policy = Policy .Handle<TException>() .CircuitBreakerAsync(num, timeSpan); while (true) { try { return await policy.ExecuteAsync(action); } catch (Exception ex) { eLLog.AddSource($"[Polly]{action.Method.Name}") .AddMessage($"异常: {ex.Message} \t执行时间: {DateTime.Now}") .AddTag("PollyCircuitBreaker") .AddTag(action.Method.Name) .AddSubmitWarn(); } Thread.Sleep(100); } } #endregion #region 组合各种场景 public void PollyWarp(Action action, params ISyncPolicy[] syncPolicies) { var mixedPolicy = Policy.Wrap(syncPolicies); mixedPolicy.Execute(action); } public async Task PollyWarpAsync(Func<Task> action, params IAsyncPolicy[] syncPolicies) { var mixedPolicy = Policy.WrapAsync(syncPolicies); await mixedPolicy.ExecuteAsync(action); } #endregion }
感觉封装了下也没什么太大的卵用~ 浪费了时间,但是还是贴出来
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/liyouming欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接。