From 625561e22cc925a56c5e52b26eaed964220a8389 Mon Sep 17 00:00:00 2001 From: bicijinlian Date: Tue, 6 Aug 2024 17:04:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Polly8Study.Test/Polly8RetryStrategyTest.cs | 12 +- Polly8Study.Test/Polly8TimeoutStrategyTest.cs | 170 +++++++++--------- Polly8Study.Test/UseXunit.cs | 4 +- Polly8Study.WebApi/Program.cs | 2 +- Polly8Study.lutconfig | 6 + 5 files changed, 101 insertions(+), 93 deletions(-) create mode 100644 Polly8Study.lutconfig diff --git a/Polly8Study.Test/Polly8RetryStrategyTest.cs b/Polly8Study.Test/Polly8RetryStrategyTest.cs index bfeb32a..33fa7d8 100644 --- a/Polly8Study.Test/Polly8RetryStrategyTest.cs +++ b/Polly8Study.Test/Polly8RetryStrategyTest.cs @@ -1,10 +1,10 @@ -namespace Polly8Study.Test +锘縩amespace Polly8Study.Test { /// - /// Polly8超时策略 测试 - /// 关键: - /// CancellationToken,没有这个是不起使用的 - /// 就是之前版本中的乐观超时,悲观超时貌似取消了 + /// Polly8瓒呮椂绛栫暐 娴嬭瘯 + /// 鍏抽敭锛 + /// CancellationToken锛屾病鏈夎繖涓槸涓嶈捣浣跨敤鐨 + /// 灏辨槸涔嬪墠鐗堟湰涓殑涔愯瓒呮椂锛屾偛瑙傝秴鏃惰矊浼煎彇娑堜簡 /// public class Polly8RetryStrategyTest { @@ -16,7 +16,7 @@ namespace Polly8Study.Test } /// - /// 重试策略 + /// 閲嶈瘯绛栫暐 /// [Fact] public void Test() diff --git a/Polly8Study.Test/Polly8TimeoutStrategyTest.cs b/Polly8Study.Test/Polly8TimeoutStrategyTest.cs index acdb517..670f29a 100644 --- a/Polly8Study.Test/Polly8TimeoutStrategyTest.cs +++ b/Polly8Study.Test/Polly8TimeoutStrategyTest.cs @@ -1,10 +1,10 @@ -namespace Polly8Study.Test +锘縩amespace Polly8Study.Test { /// - /// Polly8超时策略 测试 - /// 关键: - /// V8不支持悲观超时 - /// 只支持乐观超时:使用内部和外部CancellationToken + /// Polly8瓒呮椂绛栫暐 娴嬭瘯 + /// 鍏抽敭锛 + /// V8涓嶆敮鎸佹偛瑙傝秴鏃 + /// 鍙敮鎸佷箰瑙傝秴鏃讹細浣跨敤鍐呴儴鍜屽閮–ancellationToken /// public class Polly8TimeoutStrategyTest { @@ -16,29 +16,29 @@ namespace Polly8Study.Test } /// - /// 超时策略选项 + /// 瓒呮椂绛栫暐閫夐」 /// [Fact] public void TimeoutStrategyOptions_Test() { - //直接设置 + //鐩存帴璁剧疆 new ResiliencePipelineBuilder() .AddTimeout(TimeSpan.FromMilliseconds(100)) .Build(); - //默认值 + //榛樿鍊 var defaultOption = new TimeoutStrategyOptions(); - //全功能 + //鍏ㄥ姛鑳 TimeoutStrategyOptions timeoutOption = new TimeoutStrategyOptions { - //名称唯一标识了特定策略的特定实例,也包含在由各个弹性策略生成的遥测数据中 + //鍚嶇О鍞竴鏍囪瘑浜嗙壒瀹氱瓥鐣ョ殑鐗瑰畾瀹炰緥锛屼篃鍖呭惈鍦ㄧ敱鍚勪釜寮规х瓥鐣ョ敓鎴愮殑閬ユ祴鏁版嵁涓 Name = "timeout", - //固定超时时间(启用了TimeoutGenerator,则无效) + //鍥哄畾瓒呮椂鏃堕棿(鍚敤浜員imeoutGenerator锛屽垯鏃犳晥) Timeout = TimeSpan.FromSeconds(2), - //动态超时时间设置 + //鍔ㄦ佽秴鏃舵椂闂磋缃 //TimeoutGenerator = arg => //{ // var ts = TimeSpan.FromSeconds(Math.Pow(2, 1)); @@ -46,7 +46,7 @@ namespace Polly8Study.Test // return ValueTask.FromResult(ts); //}, - //发生超时时引发的超时委托 + //鍙戠敓瓒呮椂鏃跺紩鍙戠殑瓒呮椂濮旀墭 OnTimeout = (args) => { var key = args.Context.OperationKey; @@ -55,15 +55,17 @@ namespace Polly8Study.Test }, }; - //使用 + //浣跨敤 ResiliencePipeline pipeline = new ResiliencePipelineBuilder() .AddTimeout(timeoutOption) .Build(); + + Assert.NotEmpty(pipeline.AsSyncPolicy().PolicyKey); } /// - /// 非可取消任务:忽略超时 - /// 同步执行 + /// 闈炲彲鍙栨秷浠诲姟锛氬拷鐣ヨ秴鏃 + /// 鍚屾鎵ц /// [Fact] public void No_CancellationToken_Test() @@ -72,24 +74,24 @@ namespace Polly8Study.Test .AddTimeout(TimeSpan.FromSeconds(1)) .Build(); - //外部tcs可省略 + //澶栭儴tcs鍙渷鐣 var tcs = new CancellationTokenSource(); try { pipeline.Execute ( - //此处必须是可取消的任务,否则超时不作为(一直等待) + //姝ゅ蹇呴』鏄彲鍙栨秷鐨勪换鍔★紝鍚﹀垯瓒呮椂涓嶄綔涓(涓鐩寸瓑寰) callback: (CancellationToken innerToken) => { - //虽然接口耗时大,因为没有使用‘可取消的’ Send请求,超时设置被忽略,会等待接口正确返回 + //铏界劧鎺ュ彛鑰楁椂澶э紝鍥犱负娌℃湁浣跨敤鈥樺彲鍙栨秷鐨勨 Send璇锋眰锛岃秴鏃惰缃蹇界暐锛屼細绛夊緟鎺ュ彛姝g‘杩斿洖 HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "http://localhost:44344/api/Timeout/Slow"); - //关键:Send方法 没有传入参数 cancellationToken - //其它同步方法,只要是可取消方法均可 + //鍏抽敭锛歋end鏂规硶 娌℃湁浼犲叆鍙傛暟 cancellationToken + //鍏跺畠鍚屾鏂规硶锛屽彧瑕佹槸鍙彇娑堟柟娉曞潎鍙 HttpResponseMessage response = new HttpClient().Send(requestMessage); if (response.IsSuccessStatusCode == false) { - _output.WriteLine($"非正常响应,响应码:{response.StatusCode}"); + _output.WriteLine($"闈炴甯稿搷搴,鍝嶅簲鐮侊細{response.StatusCode}"); return; } var stream = response.Content.ReadAsStream(); @@ -98,24 +100,24 @@ namespace Polly8Study.Test var text = System.Text.UTF8Encoding.UTF8.GetString(bs); - _output.WriteLine($"响应内容:{text}"); + _output.WriteLine($"鍝嶅簲鍐呭:{text}"); - _output.WriteLine("任务执行完成"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: tcs.Token ); } catch (OperationCanceledException ex) { - _output.WriteLine($"任务取消,引发异常:{ex.Message}"); + _output.WriteLine($"浠诲姟鍙栨秷锛屽紩鍙戝紓甯:{ex.Message}"); } catch (TimeoutRejectedException ex) { - _output.WriteLine($"超时,引发异常:{ex.Message}"); + _output.WriteLine($"瓒呮椂锛屽紩鍙戝紓甯:{ex.Message}"); } catch (Exception ex) { - _output.WriteLine($"API服务异常:{ex.Message}"); + _output.WriteLine($"API鏈嶅姟寮傚父锛歿ex.Message}"); } finally { @@ -124,21 +126,21 @@ namespace Polly8Study.Test } /// - /// 可取消任务:超时 - /// 同步执行 + /// 鍙彇娑堜换鍔:瓒呮椂 + /// 鍚屾鎵ц /// [Fact] public void Has_CancellationToken_Timeout_Test() { TimeoutStrategyOptions timeoutOption = new TimeoutStrategyOptions { - //名称唯一标识了特定策略的特定实例,也包含在由各个弹性策略生成的遥测数据中 + //鍚嶇О鍞竴鏍囪瘑浜嗙壒瀹氱瓥鐣ョ殑鐗瑰畾瀹炰緥锛屼篃鍖呭惈鍦ㄧ敱鍚勪釜寮规х瓥鐣ョ敓鎴愮殑閬ユ祴鏁版嵁涓 Name = "timeout", - //固定超时时间(启用了TimeoutGenerator,则无效) + //鍥哄畾瓒呮椂鏃堕棿(鍚敤浜員imeoutGenerator锛屽垯鏃犳晥) Timeout = TimeSpan.FromSeconds(1), - //动态超时时间设置 + //鍔ㄦ佽秴鏃舵椂闂磋缃 //TimeoutGenerator = arg => //{ // var ts = TimeSpan.FromSeconds(Math.Pow(2, 1)); @@ -146,10 +148,10 @@ namespace Polly8Study.Test // return ValueTask.FromResult(ts); //}, - //发生超时时引发的超时委托 + //鍙戠敓瓒呮椂鏃跺紩鍙戠殑瓒呮椂濮旀墭 OnTimeout = (args) => { - _output.WriteLine("OnTimeout 超时委托执行"); + _output.WriteLine("OnTimeout 瓒呮椂濮旀墭鎵ц"); return ValueTask.CompletedTask; }, }; @@ -163,14 +165,14 @@ namespace Polly8Study.Test { pipeline.Execute ( - //此处必须是可取消的任务,否则超时不作为(一直等待) + //姝ゅ蹇呴』鏄彲鍙栨秷鐨勪换鍔★紝鍚﹀垯瓒呮椂涓嶄綔涓(涓鐩寸瓑寰) callback: (innerToken) => { HttpRequestMessage r = new HttpRequestMessage(HttpMethod.Get, "http://localhost:44344/api/Timeout/Slow"); var response = new HttpClient().Send(r, innerToken); if (response.IsSuccessStatusCode == false) { - Console.WriteLine("非正常响应"); + Console.WriteLine("闈炴甯稿搷搴"); return; } var stream = response.Content.ReadAsStream(); @@ -179,23 +181,23 @@ namespace Polly8Study.Test var text = System.Text.UTF8Encoding.UTF8.GetString(bs); - _output.WriteLine($"响应内容:{text}"); - _output.WriteLine("任务执行完成"); + _output.WriteLine($"鍝嶅簲鍐呭:{text}"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: tcs.Token ); } catch (OperationCanceledException ex) { - _output.WriteLine($"任务取消,引发异常:{ex.Message}"); + _output.WriteLine($"浠诲姟鍙栨秷锛屽紩鍙戝紓甯:{ex.Message}"); } catch (TimeoutRejectedException ex) { - _output.WriteLine($"超时,引发异常:{ex.Message}"); + _output.WriteLine($"瓒呮椂锛屽紩鍙戝紓甯:{ex.Message}"); } catch (Exception ex) { - _output.WriteLine($"API服务异常:{ex.Message}"); + _output.WriteLine($"API鏈嶅姟寮傚父锛歿ex.Message}"); } finally { @@ -204,21 +206,21 @@ namespace Polly8Study.Test } /// - /// 可取消任务:不超时 - /// 同步执行 + /// 鍙彇娑堜换鍔:涓嶈秴鏃 + /// 鍚屾鎵ц /// [Fact] public void Has_CancellationToken_NotTimeout_Test() { TimeoutStrategyOptions timeoutOption = new TimeoutStrategyOptions { - //名称唯一标识了特定策略的特定实例,也包含在由各个弹性策略生成的遥测数据中 + //鍚嶇О鍞竴鏍囪瘑浜嗙壒瀹氱瓥鐣ョ殑鐗瑰畾瀹炰緥锛屼篃鍖呭惈鍦ㄧ敱鍚勪釜寮规х瓥鐣ョ敓鎴愮殑閬ユ祴鏁版嵁涓 Name = "timeout", - //固定超时时间(启用了TimeoutGenerator,则无效) + //鍥哄畾瓒呮椂鏃堕棿(鍚敤浜員imeoutGenerator锛屽垯鏃犳晥) Timeout = TimeSpan.FromSeconds(5), - //动态超时时间设置 + //鍔ㄦ佽秴鏃舵椂闂磋缃 //TimeoutGenerator = arg => //{ // var ts = TimeSpan.FromSeconds(Math.Pow(2, 1)); @@ -226,10 +228,10 @@ namespace Polly8Study.Test // return ValueTask.FromResult(ts); //}, - //发生超时时引发的超时委托 + //鍙戠敓瓒呮椂鏃跺紩鍙戠殑瓒呮椂濮旀墭 OnTimeout = (args) => { - Console.WriteLine("OnTimeout 超时委托执行"); + Console.WriteLine("OnTimeout 瓒呮椂濮旀墭鎵ц"); return ValueTask.CompletedTask; }, }; @@ -243,14 +245,14 @@ namespace Polly8Study.Test { pipeline.Execute ( - //此处必须是可取消的任务,否则超时不作为(一直等待) + //姝ゅ蹇呴』鏄彲鍙栨秷鐨勪换鍔★紝鍚﹀垯瓒呮椂涓嶄綔涓(涓鐩寸瓑寰) callback: (innerToken) => { HttpRequestMessage r = new HttpRequestMessage(HttpMethod.Get, "http://localhost:44344/api/Timeout/Slow"); var response = new HttpClient().Send(r, innerToken); if (response.IsSuccessStatusCode == false) { - Console.WriteLine("非正常响应"); + Console.WriteLine("闈炴甯稿搷搴"); return; } var stream = response.Content.ReadAsStream(); @@ -259,23 +261,23 @@ namespace Polly8Study.Test var text = System.Text.UTF8Encoding.UTF8.GetString(bs); - _output.WriteLine($"响应内容:{text}"); - _output.WriteLine("任务执行完成"); + _output.WriteLine($"鍝嶅簲鍐呭:{text}"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: tcs.Token ); } catch (OperationCanceledException ex) { - _output.WriteLine($"任务取消,引发异常:{ex.Message}"); + _output.WriteLine($"浠诲姟鍙栨秷锛屽紩鍙戝紓甯:{ex.Message}"); } catch (TimeoutRejectedException ex) { - _output.WriteLine($"超时,引发异常:{ex.Message}"); + _output.WriteLine($"瓒呮椂锛屽紩鍙戝紓甯:{ex.Message}"); } catch (Exception ex) { - _output.WriteLine($"API服务异常:{ex.Message}"); + _output.WriteLine($"API鏈嶅姟寮傚父锛歿ex.Message}"); } finally { @@ -285,25 +287,25 @@ namespace Polly8Study.Test } /// - /// 不可取消任务:忽略超时 - /// 异步执行 + /// 涓嶅彲鍙栨秷浠诲姟:蹇界暐瓒呮椂 + /// 寮傛鎵ц /// [Fact] public async void No_CancellationToken_ExecuteAsync_Test() { TimeoutStrategyOptions timeoutOption = new TimeoutStrategyOptions { - //名称唯一标识了特定策略的特定实例,也包含在由各个弹性策略生成的遥测数据中 + //鍚嶇О鍞竴鏍囪瘑浜嗙壒瀹氱瓥鐣ョ殑鐗瑰畾瀹炰緥锛屼篃鍖呭惈鍦ㄧ敱鍚勪釜寮规х瓥鐣ョ敓鎴愮殑閬ユ祴鏁版嵁涓 Name = "timeout", - //固定超时时间(启用了TimeoutGenerator,则无效) + //鍥哄畾瓒呮椂鏃堕棿(鍚敤浜員imeoutGenerator锛屽垯鏃犳晥) Timeout = TimeSpan.FromSeconds(1), - //发生超时时引发的超时委托 + //鍙戠敓瓒呮椂鏃跺紩鍙戠殑瓒呮椂濮旀墭 OnTimeout = (args) => { - _output.WriteLine("OnTimeout 超时委托执行"); + _output.WriteLine("OnTimeout 瓒呮椂濮旀墭鎵ц"); return ValueTask.CompletedTask; }, }; @@ -317,27 +319,27 @@ namespace Polly8Study.Test { await pipeline.ExecuteAsync ( - //此处为不可取消的任务,忽略超时(会一直等待) + //姝ゅ涓轰笉鍙彇娑堢殑浠诲姟锛屽拷鐣ヨ秴鏃(浼氫竴鐩寸瓑寰) callback: async (innerToken) => { - //完成大约是2秒多,而不是超时的1秒多 + //瀹屾垚澶х害鏄2绉掑锛岃屼笉鏄秴鏃剁殑1绉掑 await Task.Delay (1000*3); - _output.WriteLine("任务执行完成"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: tcs.Token ); } catch (OperationCanceledException ex) { - _output.WriteLine($"任务取消,引发异常:{ex.Message}"); + _output.WriteLine($"浠诲姟鍙栨秷锛屽紩鍙戝紓甯:{ex.Message}"); } catch (TimeoutRejectedException ex) { - _output.WriteLine($"超时,引发异常:{ex.Message}"); + _output.WriteLine($"瓒呮椂锛屽紩鍙戝紓甯:{ex.Message}"); } catch (Exception ex) { - _output.WriteLine($"API服务异常:{ex.Message}"); + _output.WriteLine($"API鏈嶅姟寮傚父锛歿ex.Message}"); } finally { @@ -346,8 +348,8 @@ namespace Polly8Study.Test } /// - /// 可取消任务:超时 - /// 异步执行 + /// 鍙彇娑堜换鍔:瓒呮椂 + /// 寮傛鎵ц /// /// [Fact] @@ -364,9 +366,9 @@ namespace Polly8Study.Test ( callback: async (innerToken) => { - //完成大约是超时的1秒多,而不是任务的3秒多 + //瀹屾垚澶х害鏄秴鏃剁殑1绉掑锛岃屼笉鏄换鍔$殑3绉掑 await Task.Delay(1000 * 3, innerToken); - _output.WriteLine("任务执行完成"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: cts.Token ); @@ -374,8 +376,8 @@ namespace Polly8Study.Test } /// - /// 可取消任务:不超时 - /// 异步执行 + /// 鍙彇娑堜换鍔:涓嶈秴鏃 + /// 寮傛鎵ц /// /// [Fact] @@ -392,9 +394,9 @@ namespace Polly8Study.Test ( callback: async (innerToken) => { - //不超时,完成大约是任务耗时的1秒 + //涓嶈秴鏃讹紝瀹屾垚澶х害鏄换鍔¤楁椂鐨1绉 await Task.Delay(1000, innerToken); - _output.WriteLine("任务执行完成"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); }, cancellationToken: cts.Token ); @@ -406,8 +408,8 @@ namespace Polly8Study.Test } // - /// 可取消任务:超时 - /// 异步执行,无外层Token + /// 鍙彇娑堜换鍔:瓒呮椂 + /// 寮傛鎵ц锛屾棤澶栧眰Token /// /// [Fact] @@ -424,9 +426,9 @@ namespace Polly8Study.Test ( callback: async (innerToken) => { - //完成大约是超时的1秒多,而不是任务的3秒多 + //瀹屾垚澶х害鏄秴鏃剁殑1绉掑锛岃屼笉鏄换鍔$殑3绉掑 await Task.Delay(1000 * 3, innerToken); - _output.WriteLine("任务执行完成"); + _output.WriteLine("浠诲姟鎵ц瀹屾垚"); } ); }); @@ -445,22 +447,22 @@ namespace Polly8Study.Test { pipeline.Execute ( - //此处必须是可取消的任务,否则超时不作为(一直等待) + //姝ゅ蹇呴』鏄彲鍙栨秷鐨勪换鍔★紝鍚﹀垯瓒呮椂涓嶄綔涓(涓鐩寸瓑寰) callback: SyncWithCancellationToken, cancellationToken: tcs.Token ); } catch (OperationCanceledException ex) { - _output.WriteLine($"任务取消,引发异常:{ex.Message}"); + _output.WriteLine($"浠诲姟鍙栨秷锛屽紩鍙戝紓甯:{ex.Message}"); } catch (TimeoutRejectedException ex) { - _output.WriteLine($"超时,引发异常:{ex.Message}"); + _output.WriteLine($"瓒呮椂锛屽紩鍙戝紓甯:{ex.Message}"); } catch (Exception ex) { - _output.WriteLine($"API服务异常:{ex.Message}"); + _output.WriteLine($"API鏈嶅姟寮傚父锛歿ex.Message}"); } finally { @@ -469,7 +471,7 @@ namespace Polly8Study.Test } /// - /// 使用CancellationToken的同步方法 + /// 浣跨敤CancellationToken鐨勫悓姝ユ柟娉 /// private void SyncWithCancellationToken(CancellationToken cancellationToken) { diff --git a/Polly8Study.Test/UseXunit.cs b/Polly8Study.Test/UseXunit.cs index 06b60ce..d216c2e 100644 --- a/Polly8Study.Test/UseXunit.cs +++ b/Polly8Study.Test/UseXunit.cs @@ -1,4 +1,4 @@ -namespace Polly8Study.Test +锘縩amespace Polly8Study.Test { public class UseXunit { @@ -12,7 +12,7 @@ namespace Polly8Study.Test [Fact] public void Use_xUnit_Test() { - var msg = "使用 xUnit 单元测试框架!"; + var msg = "浣跨敤 xUnit 鍗曞厓娴嬭瘯妗嗘灦锛"; Assert.True(true, msg); _output.WriteLine(msg); diff --git a/Polly8Study.WebApi/Program.cs b/Polly8Study.WebApi/Program.cs index 8f38c3e..6daac28 100644 --- a/Polly8Study.WebApi/Program.cs +++ b/Polly8Study.WebApi/Program.cs @@ -1,4 +1,4 @@ - +锘 using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; diff --git a/Polly8Study.lutconfig b/Polly8Study.lutconfig new file mode 100644 index 0000000..596a860 --- /dev/null +++ b/Polly8Study.lutconfig @@ -0,0 +1,6 @@ + + + true + true + 180000 + \ No newline at end of file