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[0];
            }, async r =>
            {
                try
                {
                    //这里如果抛出错误不用catch捕捉的话,就不会走到通知的方法。
                    throw new Exception("error");
                    //先来个降级熔断。
                    Console.WriteLine("我降级熔断了");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("熔断异常");
                }
            });

            try
            {
                //设置一个超时时间,里面加个回调函数给个提示
                var pTimeout = Policy.TimeoutAsync(20, 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}");
            }

原文地址:https://www.cnblogs.com/llcdbk/p/11841743.html

时间: 2024-10-30 14:11:27

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

【转】安装计算机系统的几种常用方法

原文:http://jingyan.baidu.com/article/49ad8bce6a5b295834d8fa90.html 任务:装系统有几种方法.标题更改为:安装计算机系统的几种常用方法.安装计算机系统的方法很多,下面介绍几种安装计算机系统的常用方法,供大家参考. 工具/原料 硬件:计算机 方法/步骤 1 安装计算机系统的几种常用方法 第一种方法:制作U盘启动盘安装系统. 这种方法适合绝大多数的计算机,但也有少数计算机的主板没有USB启动设置,这类型的计算机不能用U盘安装系统的方法来安

查看Oracle执行计划的几种常用方法-系列3

续上篇:http://blog.csdn.net/bisal/article/details/39225373 4. 10046事件 通过10046事件也可以查看目标SQL的执行计划.像10046这种事件,都不是Oracle官方文档中可以查询到的,这些事件一般用于调试目的,因此往往可以使用他们找到问题更详细的信息. 10046事件和之前的explain plan.DBMS_XPLAN包以及AUTOTRACE开关的区别在于,10046事件产生的trc文件中明确显示了目标SQL实际执行计划中每一步所

NSString的几种常用方法

NSString的几种常用方法 要把 “2011-11-29” 改写成 “2011/11/29”一开始想用ios的时间格式,后来用NSString的方法搞定. [string stringByReplacingOccurrencesOfString:@"-"withString:@"/"]; 一句话搞定. 发现NSString还是很值得研究下,于是做做笔记. 看了天梯梦的博客觉得相当不错,于是懒得写了直接粘贴转载.原文地址 http://justcoding.ite

map集合遍历的几种常用方法

import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.Map.Entry; /** * map集合和set集合一样是无序的 * map集合遍历的几种常用方法 * @author Owner * */ public class MapTest5 { public static void main(String[] args) 

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

js中函数调用的两种常用方法. 一个js函数 function test(aa){ window.alert("你输入的是"+aa); } 方法一:直接调用 test("dddd");方法二:函数赋值给变量var abc=test;abc('中国');//用变量来调用函数注意:当写成这种形式的时候,var abc=test("dddd"); 不能通过变量abc来调用函数.这种写法当test有返回值的时候会把返回值赋值给abc,当没有返回值的时候a

.net实现文件读写的几种常用方法

文件的读写是.net中常用的功能,本文即以实例形式展示.net实现文件读写的几种常用方法,供大家参考之用.具体如下: 在.net中有很多有用的类库来读写硬盘上的文件,一般比较常用的有: File: 1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用 2.不同的方式可以读写文件类型不一样. ReadAllBytes()  WriteAllByte():可以读写任意类型的文件 (里面封装的是FileStream) ReadAllLines()  ReadAllText():(里

vue——props的两种常用方法

vue--props的两种常用方法 1.实现父-->子的通信 举例如下: 父组件 parent.vue <children :channel="object1"></children> 子组件 children.vue export default{ name:"children", props:["channel"], data(){ return{ newChannel:null } } methods:{ fu

数组的几种常用方法

数组的几种常用方法 // //unshift()添加,将要给定的数值添加到数组的开头 // var arr1=["王白菜","牛春","野老多"];// console.log(arr1.unshift("大脸","老安"));//5// console.log(arr1);// // ["大脸", "老安", "王白菜", "牛春&qu

使用CSS隐藏HTML元素的四种常用方法

CSS隐藏HTML元素的四种常用方法 1.opacity:设置opacity: 0可以使一个元素变得完全透明. 设置的透明度会被子元素继承,而且无法取消. 通常可以使用opacity属性来制作元素的淡入淡出效果. 设置opacity:1可以使透明元素变得可见. 2.visibility: 是许多人在隐藏某个HTML元素时的首选. visibility:hidden视觉上看不见,但它所占据空间的位置仍然存在. 3.display:none它是position:absolute和visibility