/// <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();
} }
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();
} }
/// <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();
} } 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();
}
} #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 }

感觉封装了下也没什么太大的卵用~ 浪费了时间,但是还是贴出来

.NetCore中结合ExceptionLess的处理对Polly再次封装的更多相关文章

  1. .NetCore中使用ExceptionLess记录Polly中的操作异常日志

    结合上一篇文章我写了一个demo测试下 重试2次 _polly.PollyRetry<Exception>(()=>_demoQuery.GetTestAOPAsync(), ); ...

  2. .NetCore中使用ExceptionLess 添加操作日志

    上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...

  3. .NetCore 中扩展ExceptionLess 实现链式方法添加操作日志

    在使用ExceptionLess添加日志的时候,发现还是有一些写法上的个人觉得不爽的地方,比如添加Info日志 ExceptionlessClient.Default.CreateLog(source ...

  4. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul

    相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...

  5. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级

    相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...

  6. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  7. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  8. AutoMapper在asp.netcore中的使用

    # AutoMapper在asp.netcore中的使用  automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,htt ...

  9. netcore中的缓存介绍

    Cache(缓存)是优化web应用的常用方法,缓存存放在服务端的内存中,被所有用户共享.由于Cache存放在服务器的内存中,所以用户获取缓存资源的速度远比从服务器硬盘中获取快,但是从资源占有的角度考虑 ...

随机推荐

  1. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  2. MT【188】一个正切余切有关的恒等式

    (2017北大特优)求$9\tan 10^\circ+2\tan 20^\circ+4\tan 40^\circ-\tan 80^\circ=$_____ A.$0$ B.$\dfrac{\sqrt ...

  3. 【刷题】LOJ 2818 「eJOI2018」循环排序

    题目描述 本题译自 eJOI2018 Problem F「Cycle Sort」 给定一个长为 \(n\) 的数列 \(\{a_i\}\) ,你可以多次进行如下操作: 选定 \(k\) 个不同的下标 ...

  4. 【ARC082D】Sandglass

    Description ​ 题目链接 Description ​ 好题.题意是维护一个初始值,交替加减一段时间,有上界\(m\)和下界0(不能超过这两条界限),问对于某一种初始值,在某一个时刻时该值为 ...

  5. bzoj2616: SPOJ PERIODNI——笛卡尔树+DP

    不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...

  6. SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解

    一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...

  7. python oracle使用心得

    Oracel安装(windows 64位) 1. 首先确定版本. 2. 下载instantclient,下载地址:http://www.oracle.com/technetwork/database/ ...

  8. 初识python面向对象编程

    初识python面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.面向过程的程序设计思想 #!/usr/bin/env python #_*_coding:utf-8 ...

  9. OpenStack中MySQL高可用配置

    采用Heartbeat+DRBD+mysql高可用方案,配置两个节点的高可用集群 l  配置各节点互相解析 gb07 gb06 l  配置各节点时间同步 gb07 [root@gb07 ~]# ntp ...

  10. Tomcat get 中文乱码

    乱码问题 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来 ...