/// <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. 【bzoj4771】七彩树 树链的并+STL-set+DFS序+可持久化线段树

    题目描述 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义 ...

  2. LOG4J 的配置

    公司启动全国支票影像系统,有这样一个功能是和消息中间件打交道,需要记录每一个报文出错情况,因为方便后期开发人员的调试,我选用了log4j作为日志记录,好了废话不多说了! 第一步:首先建立一个WEB工程 ...

  3. MySQL 主从复制详解

    读写分离的意思是,写入的时候向 a 服务器写入,而读出的时候从 b c d 甚至更多的服务器读出:这样的架构适合于读多写少的应用,最典型的就是火车购票系统,一般我们买票的时候要先查询好多次,包括车次啊 ...

  4. dp乱写2:论dp在不在dp中(但在dp范畴)内的应用

    最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了比如说:过河卒.方格取数.导弹拦截.加分二叉树.炮兵阵地更加明显的还有:采药.装箱问题.过河.金明的预算方案.今天来谈谈dp的dp在不在dp ...

  5. @RequestParam注解一般用法

    原文链接:https://www.cnblogs.com/likaileek/p/7218252.html SpringMVC注解@RequestParam全面解析   在此之前,写项目一直用的是@R ...

  6. python xml.etree.ElementTree模块

    使用的XML文件如下:file.xml <?xml version="1.0"?> <data name="ming"> <cou ...

  7. Hadoop生态圈-使用Kafka命令在Zookeeper中对应关系

    Hadoop生态圈-使用Kafka命令在Zookeeper中对应关系 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zookeeper保存kafka的目录     二.使用Ka ...

  8. C语言复习---比赛问题

    一:比赛问题 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. ...

  9. 网络编程之tcp窗口滑动以及拥塞控制

    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议     关于这部分自己不晓得怎么叙述才好,因为理解的部 ...

  10. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...