参考资料:https://www.cnblogs.com/edisonchou/p/9159644.html

特征:可以实现一些代码的熔断和降级

代码:

 ////普通,其中 Fallback相当于降级处理
//Policy.Handle<ArgumentException>().Fallback(()=>{
// MessageBox.Show("Error occured");
//}).Execute(()=> {
// MessageBox.Show("Job Start");
// throw new ArgumentException("Hello Polly!");
// MessageBox.Show("Job End");
//}); ////重试 3次重试后结束
//Policy.Handle<ArgumentException>().Retry(3).Execute(() => {
// MessageBox.Show("Job retry Start");
// throw new ArgumentException("Hello retry Polly!");
// MessageBox.Show("Job retry End");
//}); ////熔断 重试3次后再次失败以后十秒一次调用
//var policy = Policy.Handle<Exception>().CircuitBreaker(3, TimeSpan.FromSeconds(10));
//while (true)
//{
// try
// {
// policy.Execute(() =>
// {
// Console.WriteLine("Job Start");
// throw new Exception("Special error occured");
// Console.WriteLine("Job End");
// });
// }
// catch (Exception ex)
// {
// Console.WriteLine("There's one unhandled exception : " + ex.Message);
// }
// Thread.Sleep(500);
//} ////这里涉及到Polly中关于超时的两个策略:一个是悲观策略(Pessimistic),一个是乐观策略(Optimistic)。其中,悲观策略超时后会直接抛异常,而乐观策略则不会
//// Wrap是指策略封装,可以把多个ISyncPolicy合并到一起执行。Timeout则是指超时处理,但是超时策略一般不能直接使用,而是其其他策略封装到一起使用。
////thread.sleep这个超时没有用走Fallback方法,但是再excute里面执行一个方法出异常的时候会走fallback方法
//try
//{
// var policyExp = Policy.Handle<Exception>().Fallback(() =>
// {
// Console.WriteLine("Fallback");
// }); // var policyTimtout = Policy.Timeout(3, TimeoutStrategy.Pessimistic); // var mainPolicy = Policy.Wrap(policyTimtout, policyExp);
// mainPolicy.Execute(() =>
// {
// Console.WriteLine("Job Start...");
// Thread.Sleep(5000);
// //throw new Exception("error");
// Console.WriteLine("Job End...");
// });
//}
//catch (Exception ex)
//{
// Console.WriteLine($"Unhandled exception : {ex.GetType()} : {ex.Message}");
//} ////一些高级方法 :WaitAndRetryAsync,等待异步完成,并且重试指定次数 ExecuteAndCaptureAsync,执行并且返回一个自己方法需要返回的类型,可以在这里查看更多 https://github.com/App-vNext/Polly var policy = Policy<byte[]>.Handle<Exception>()
.FallbackAsync(async c =>
{
//熔断后再来个通知
Console.WriteLine("熔断完成,通知一下");
return new byte[];
}, async r =>
{
try
{
//这里如果抛出错误不用catch捕捉的话,就不会走到通知的方法。
throw new Exception("error");
//先来个降级熔断。
Console.WriteLine("我降级熔断了");
}
catch (Exception ex)
{
Console.WriteLine("熔断异常");
}
}); try
{
//设置一个超时时间,里面加个回调函数给个提示
var pTimeout = Policy.TimeoutAsync(, TimeoutStrategy.Pessimistic,
async (context, timespan, task) =>
{
Console.WriteLine("Timeout!");
});
var excPolicy = policy.WrapAsync(pTimeout);
var bytes = await excPolicy.ExecuteAsync(async () =>
{
Console.WriteLine("start Job");
//throw new Exception("error");
HttpClient httpClient = new HttpClient();
var result = await httpClient.GetByteArrayAsync("https://images2018.cnblogs.com/blog/381412/201806/381412-20180606230929894-145212290.png");
Console.WriteLine("Finish Job");
return result;
});
Console.WriteLine($"Length of bytes : {bytes.Length}");
}
catch (Exception ex)
{
//这里如果熔断的方法抛出异常的时候,可以从这里捕捉主方法的执行异常,如果熔断方法没有异常的情况下,主方法报错也不会走到这个地方的
Console.WriteLine($"Unhandled exception : {ex.GetType()} : {ex.Message}");
}

polly的几种常用方法的更多相关文章

  1. Java中从控制台输入数据的几种常用方法

    Java中从控制台输入数据的几种常用方法 一.使用标准输入串System.in //System.in.read()一次只读入一个字节数据,而我们通常要取得一个字符串或一组数字 //System.in ...

  2. jQuery验证元素是否为空的两种常用方法

    这篇文章主要介绍了jQuery验证元素是否为空的两种常用方法,实例分析了两种常用的判断为空技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了jQuery验证元素是否为空的两种常用方法.分享给 ...

  3. 在Quartus II中分配管脚的两种常用方法

    在Quartus II中分配管脚的两种常用方法 示范程序 seg7_test.v 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* * ...

  4. NSString的几种常用方法

    NSString的几种常用方法   要把 “2011-11-29” 改写成 “2011/11/29”一开始想用ios的时间格式,后来用NSString的方法搞定. [string stringByRe ...

  5. Java更新XML的四种常用方法简介

    本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for X ...

  6. vue——props的两种常用方法

    vue--props的两种常用方法 1.实现父-->子的通信 举例如下: 父组件 parent.vue <children :channel="object1"> ...

  7. C#程序实现软件开机自动启动的两种常用方法

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法函数的示例与实例带详细注释 方法一:将软件的快捷方式创建到计算机的自动启动目录下(不需要管理员权限) 1.必要引用 ...

  8. [C#.Net]启动外部程序的几种常用方法汇总

    本文汇总了C#启动外部程序的几种常用方法,非常具有实用价值,主要包括如下几种方法: 1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启 ...

  9. js函数调用二种常用方法的例子

    js中函数调用的两种常用方法. 一个js函数 function test(aa){ window.alert("你输入的是"+aa); } 方法一:直接调用 test(" ...

随机推荐

  1. 20190908 On Java8 第十九章 类型信息

    第十九章 类型信息 RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息. Java 主要有两种方式在运行时识别对象和类信息: "传 ...

  2. python+selenium的WebElement对象操作

    webelement对象操作 webelement对象是selenium中所有元素的父类,也就是webelement对象拥有的方法,其它元素对象都会有: 只是不同的对象在调用特定方法时,效果是不一样的 ...

  3. oracle--少见操作、如何调整dos窗口大小、字符集设置

    如何调整dos窗口大小 1.set linesize 400; 2.右键 --默认值 断开.连接 disconn ; conn ww/ww; 关于字符集 操作系统环境变量针对语言项设置有几个,我经常设 ...

  4. Soap从入门到实战

    Soap从入门到实战 参考文章:https://howtodoinjava.com/spring-boot/spring-soap-client-webservicetemplate/ 使用的技术:s ...

  5. jquery点击切换在点击切换

    <div style=" position: absolute; top: 6rem; right: 4rem;" id="hides" > < ...

  6. SpringMvc+Mybatis开发调用存储过程

    <mapper namespace="com.jkw100.ssm.mapper.CustomerMapperCustom" > <!-- statementTy ...

  7. HDFS数据流——写数据流程

    剖析HDFS文件写入 假设文件ss.avi共200m,其写入HDFS指定路径/user/atguigu/ss.avi流程如下: 1)客户端向namenode请求上传文件到指定路径,namenode通过 ...

  8. AtCoder Beginner Contest 133-C - Remainder Minimization 2019

    https://atcoder.jp/contests/abc133/tasks/abc133_c 思路:由于L,R区间太大,所以不能暴力枚举.由于求(i*j)%2019的最小值,那么2019的倍数对 ...

  9. HihoCoder - 1093 小Hi和小Ho (SPFA)

    描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两 ...

  10. Javascript 中的深浅拷贝

    工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...