.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();
} }
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再次封装的更多相关文章
- .NetCore中使用ExceptionLess记录Polly中的操作异常日志
结合上一篇文章我写了一个demo测试下 重试2次 _polly.PollyRetry<Exception>(()=>_demoQuery.GetTestAOPAsync(), ); ...
- .NetCore中使用ExceptionLess 添加操作日志
上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...
- .NetCore 中扩展ExceptionLess 实现链式方法添加操作日志
在使用ExceptionLess添加日志的时候,发现还是有一些写法上的个人觉得不爽的地方,比如添加Info日志 ExceptionlessClient.Default.CreateLog(source ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Ocelot+Polly缓存、限流、熔断、降级
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- AutoMapper在asp.netcore中的使用
# AutoMapper在asp.netcore中的使用 automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,htt ...
- netcore中的缓存介绍
Cache(缓存)是优化web应用的常用方法,缓存存放在服务端的内存中,被所有用户共享.由于Cache存放在服务器的内存中,所以用户获取缓存资源的速度远比从服务器硬盘中获取快,但是从资源占有的角度考虑 ...
随机推荐
- CUDA ---- device管理
device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置. 本博文将主要介绍下面两方面内容: CUDA run ...
- Django时间时区问题(received a naive datetime while time zone support is active)
在django1.4以后,存在两个概念 naive time 与 active time. 简单点讲,naive time就是不带时区的时间,Active time就是带时区的时间. 举例来说,使用d ...
- pandas read_csv 读取中文列标题文件报错
Traceback (most recent call last): File "C:/Users/arron/PycharmProjects/ML/ML/test.py", li ...
- bzoj1178/luogu3626 会议中心 (倍增+STL::set)
贪心地,可以建出一棵树,每个区间对应一个点,它的父亲是它右边的.与它不相交的.右端点最小的区间. 为了方便,再加入一个[0,0]区间 于是就可以倍增来做出从某个区间开始,一直到某个右界,这之中最多能选 ...
- 文件操作,内置函数open()
先看看官方说明: The default mode is 'r' (open for reading text, synonym of 'rt'). For binary read-write acc ...
- ssm框架配置过程
1.pom.xml配置 1.1<build>标签中配置<plugins>和<resources>,即插件和资源文件 1.2 <properties>标签 ...
- POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)
POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...
- QeePHP View视图的默认变量与新增变量
新版本的QeePHP(V13.1)中,视图页面已经默认添加了几个常用变量 $_app; //控制器所属的应用程序 $_login_user; //登陆用户信息 直接在视图页面直接使用变量即可. 如果 ...
- MySQL-->高级-->001-->MySQL备份与恢复测试
- vue element-ui 实现点击查看审核记录
<el-dialog title="审核信息" :visible.sync="seeVisible" width="30%" :bef ...