参考资料: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. Sentinel整合Dubbo限流实战(分布式限流)

    之前我们了解了 Sentinel 集成 SpringBoot实现限流,也探讨了Sentinel的限流基本原理,那么接下去我们来学习一下Sentinel整合Dubbo及 Nacos 实现动态数据源的限流 ...

  2. Java-集合第四篇Queue集合

    1.什么是Queue 模拟队列数据结构,先进先出(FIFO),从队尾加元素,从队头取元素.     2.Queue接口中定义了如下几个方法: 1>void add(Object o):将指定元素 ...

  3. poj-2516.minimum cost(k次费用流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19883   Accepted: 7055 Des ...

  4. Sql Server主副本和辅助副本间账号同步以及权限同步

    问题描述 SqlServer如果配置了AlwaysOn,其数据库账号信息同步会出现问题. 我遇到的情况是在主副本添加了账号信息,且给某个数据库添加了权限,这个账号会同步至辅助副本,但是数据库角色信息没 ...

  5. Count Color poj2777 线段树

    Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...

  6. 干货!小白入门Python数据科学全教程

    前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...

  7. Arrays.asList使用指南和一些坑(转)

    一.java.util.Arrays.asList() 的一般用法 List 是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现: String[] m ...

  8. ES6精解:变量的解构赋值

    1.数组的解构赋值 我们知道以前我们给一个变量赋值要这样如下: let a = 1; let b = 2; let c = 3; 但是ES6出来之后,我们可以这样: let [a, b, c] = [ ...

  9. neo4j 的cql 语句,增、删、改、查(条件查询)(持续更新)

    前言 因为做一个比赛的项目 ,需要用到 neo4j 数据库,所以要学习其语言cql,特来整理一下他的基本语言. 整片的语句是按照 了 Neo4j 数据库自带的示例 Movie Graph 来写的. 直 ...

  10. the sum of two fixed value

    the sum of two fixed value description Input an array and an integer, fina a pair of number in the a ...