参考资料: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. Spring Framework基础学习

    Spring Framework基础学习 Core support for dependency injection,transaction management,web applications,d ...

  2. 前端项目中使用jsencrypt进行字段加密

    前端项目中使用jsencrypt进行字段加密. 使用步骤:①获取公钥②实例化对象③设置公钥④将所需数据进行加密然后返回. 进行一个简单的封装如下 /** * npm install jsencrypt ...

  3. Redis介绍及入门安装及使用

    Redis介绍及入门安装及使用 什么是Redis Redis is an open source (BSD licensed), in-memory data structure store, use ...

  4. Java设计模式——模板方法设计模式(abstract修饰)

    解释: 一个抽象类中,有一个主方法,再定义 1...n 个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用. 解决的问题: 当功能内部一 ...

  5. Form表单组件验证

    第一版:最基本版本 views源码 #——————————————————————form验证—————————————— from django import forms from django.f ...

  6. C# Lodop与C-Lopdop选择打印机

    原文:https://www.cnblogs.com/huaxie/p/9766886.html https://www.cnblogs.com/huaxie/p/10857490.html http ...

  7. windwos下nginx 配置https并http强制跳转https

    windwos下nginx  配置https并http强制跳转https 一.首先配置证书文件 申请证书文件,这里就不做详细过程了,直接看证书文件结果. 这是两个证书的关键文件 打开ngxin下con ...

  8. Spark MLlib机器学习(一)——决策树

    决策树模型,适用于分类.回归. 简单地理解决策树呢,就是通过不断地设置新的条件标准对当前的数据进行划分,最后以实现把原始的杂乱的所有数据分类. 就像下面这个图,如果输入是一大堆追求一个妹子的汉子,妹子 ...

  9. sqli(8)

    第八关:单引号GET盲注 前言:感冒了很有以后摸到靶场,如若隔世....我的天,说不定又有同学要去实习了,再看看我.啧啧啧,神的飞起来.. 盲注需要掌握一些MySQL的相关函数:length(str) ...

  10. gitignore 忽略文件

    *.project*.prefs*.classpath*.gitignore#ignore thumbnails created by windowsThumbs.db#Ignore files bu ...