/// <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. 一个由于springboot自动配置所产生的问题的解决

    由于我的项目里面需要使用到solr,我做了一下solr和springboot的整合,结果启动项目的时候,就报错了...报错的信息的第一行提示如下: org.springframework.beans. ...

  2. pom.xml文件中,添加自定义参数Properties

    <properties> <powermock.version>1.6.6</powermock.version> </properties> < ...

  3. 【题解】 [SCOI2011]糖果 (差分约束)

    懒得复制,戳我戳我 Solution: 首先考虑\(X=1\)的情况,我们其实只用用一下并查集把相等的点合为一个点 然后后面的四个式子我们就可以用差分约束了,就拿\(X=2\)的情况来说吧,我们用\( ...

  4. 【Luogu1344】追查坏牛奶(最小割)

    [Luogu1344]追查坏牛奶(最小割) 题面 洛谷 题解 裸的最小割,但是要求边的数量最小. 怎么办呢?给每条边的权值额外加上一个很大的值就了. #include<iostream> ...

  5. USACO Section 1.4 Mother's Milk 解题报告

    题目 题目描述 有三个牛奶桶,三个桶的容积分别是A,B,C,最小为1,最大为20.刚开始只有第三个桶里面装满了牛奶,其余两个桶都是空的.我们现在可以将第三个桶中的牛奶往其他两个桶里面倒一些牛奶,然后还 ...

  6. 数组初始化 memset fill

    #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #in ...

  7. cookie工具包

    package com.taotao.common.utils; import java.io.UnsupportedEncodingException; import java.net.URLDec ...

  8. python singleton design pattern super() 多继承

    python  singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...

  9. create-react-app脚手架使用

    1.安装脚手架和路由 npm i -g create-react-app npm i -S react-router react-router-dom 2.创建新项目 create-react-app ...

  10. saltstack主机管理项目【day23】:主机管理项目需求分析-设计

    本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编主机分发器 一. 主机管理项目需求分析 场景:我现在又一台裸机要实现一下人物 配置管理: ...