polly的几种常用方法
参考资料: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的几种常用方法的更多相关文章
- Java中从控制台输入数据的几种常用方法
Java中从控制台输入数据的几种常用方法 一.使用标准输入串System.in //System.in.read()一次只读入一个字节数据,而我们通常要取得一个字符串或一组数字 //System.in ...
- jQuery验证元素是否为空的两种常用方法
这篇文章主要介绍了jQuery验证元素是否为空的两种常用方法,实例分析了两种常用的判断为空技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了jQuery验证元素是否为空的两种常用方法.分享给 ...
- 在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 /* * ...
- NSString的几种常用方法
NSString的几种常用方法 要把 “2011-11-29” 改写成 “2011/11/29”一开始想用ios的时间格式,后来用NSString的方法搞定. [string stringByRe ...
- Java更新XML的四种常用方法简介
本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for X ...
- vue——props的两种常用方法
vue--props的两种常用方法 1.实现父-->子的通信 举例如下: 父组件 parent.vue <children :channel="object1"> ...
- C#程序实现软件开机自动启动的两种常用方法
C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法函数的示例与实例带详细注释 方法一:将软件的快捷方式创建到计算机的自动启动目录下(不需要管理员权限) 1.必要引用 ...
- [C#.Net]启动外部程序的几种常用方法汇总
本文汇总了C#启动外部程序的几种常用方法,非常具有实用价值,主要包括如下几种方法: 1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启 ...
- js函数调用二种常用方法的例子
js中函数调用的两种常用方法. 一个js函数 function test(aa){ window.alert("你输入的是"+aa); } 方法一:直接调用 test(" ...
随机推荐
- levelDB SSTable-静态布局结构
SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节. 本节内容主要讲述S ...
- 2019南京网络赛E:K Sum
Description: 定义函数 \[ f _n (k) = \sum _{l _1 = 1} ^n \sum _{l _2 = 1} ^n \cdots \sum _{l _k = 1} ^n \ ...
- Qt之UI文件设计和运行机制
1.项目文件组成在QtCreator中新建一个WidgetApplocation项目,选中窗口基类中选中QWidget作为窗口基类,并选中"GnerateForm"复选框.创建后项 ...
- POJ-1502 MPI Maelstrom 迪杰斯特拉+题解
POJ-1502 MPI Maelstrom 迪杰斯特拉+题解 题意 题意:信息传输,总共有n个传输机,先要从1号传输机向其余n-1个传输机传输数据,传输需要时间,给出一个严格的下三角(其实就是对角线 ...
- 牛客练习赛51 C 勾股定理https://ac.nowcoder.com/acm/contest/1083/C
题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形. 输入描述: 一个整数n. 输出描述: 另外两条边b,c.答案不唯一,只要输出任意一组即为合理, ...
- P1455 搭配购买 (并查集+01背包)
[题目描述] 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵 ...
- 修复线上bug
1,git branch new_branch 2,git push origin new_branch 以上是线上地址操作,以下是本地仓库操作 3,git fetch 4,git checkout ...
- HTML拖放元素
实现来回拖放图片 <!DOCTYPE HTML> <html> <title>来回拖放元素</title> <meta charset=" ...
- vue中搜索关键词,使文本标红
UserHead.vue中搜索框: <!-- 搜索 --> <el-col :span="6" :offset="8" class=" ...
- C# Windows Services 启动和结束其它进程
将exe所在的绝对路径和进程名配置到配置文件中 <add key="FilePath" value="D:\ABC\ABCD.Console.exe"/& ...