Polly是一個.NET彈性和瞬態故障處理庫,允許開發人員以流暢和執行緒安全的方式表達諸如重試,斷路器,超時,隔離頭和回退之類的策略,
Polly面向.NET Standard 1.1(覆寫范圍:.NET Core 1.0,Mono,Xamarin,UWP,WP8.1 +)和.NET Standard 2.0+(覆寫范圍:.NET Core 2.0 + 、. NET Core 3.0和更高版本的Mono,Xamarin和UWP目標),nuget軟體包還包括.NET Framework 4.6.1和4.7.2的直接目標,
使用方式
通過NuGet安裝
Install-Package Polly
用法
故障處理,回應策略
故障處理策略處理您通過策略執行的委托引發的特定例外或 回傳的結果,
步驟1:指定您希望策略處理的例外/錯誤
// Single exception type Policy .Handle<HttpRequestException>() // Single exception type with condition Policy .Handle<SqlException>(ex => ex.Number == 1205) // Multiple exception types Policy .Handle<HttpRequestException>() .Or<OperationCanceledException>() // Multiple exception types with condition Policy .Handle<SqlException>(ex => ex.Number == 1205) .Or<ArgumentException>(ex => ex.ParamName == "example") // Inner exceptions of ordinary exceptions or AggregateException, with or without conditions // (HandleInner matches exceptions at both the top-level and inner exceptions) Policy .HandleInner<HttpRequestException>() .OrInner<OperationCanceledException>(ex => ex.CancellationToken != myToken)
步驟2:指定策略應如何處理這些故障
2.1、重試
// Retry once Policy .Handle<SomeExceptionType>() .Retry() // Retry multiple times Policy .Handle<SomeExceptionType>() .Retry(3) // Retry multiple times, calling an action on each retry // with the current exception and retry count Policy .Handle<SomeExceptionType>() .Retry(3, onRetry: (exception, retryCount) => { // Add logic to be executed before each retry, such as logging }); // Retry multiple times, calling an action on each retry // with the current exception, retry count and context // provided to Execute() Policy .Handle<SomeExceptionType>() .Retry(3, onRetry: (exception, retryCount, context) => { // Add logic to be executed before each retry, such as logging });
2.2、永遠重試(直到成功)
// Retry forever Policy .Handle<SomeExceptionType>() .RetryForever() // Retry forever, calling an action on each retry with the // current exception Policy .Handle<SomeExceptionType>() .RetryForever(onRetry: exception => { // Add logic to be executed before each retry, such as logging }); // Retry forever, calling an action on each retry with the // current exception and context provided to Execute() Policy .Handle<SomeExceptionType>() .RetryForever(onRetry: (exception, context) => { // Add logic to be executed before each retry, such as logging });
2.3、等待并重試
// Retry, waiting a specified duration between each retry. // (The wait is imposed on catching the failure, before making the next try.) Policy .Handle<SomeExceptionType>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3) }); // Retry, waiting a specified duration between each retry, // calling an action on each retry with the current exception // and duration Policy .Handle<SomeExceptionType>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3) }, (exception, timeSpan) => { // Add logic to be executed before each retry, such as logging }); // Retry, waiting a specified duration between each retry, // calling an action on each retry with the current exception, // duration and context provided to Execute() Policy .Handle<SomeExceptionType>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3) }, (exception, timeSpan, context) => { // Add logic to be executed before each retry, such as logging }); // Retry, waiting a specified duration between each retry, // calling an action on each retry with the current exception, // duration, retry count, and context provided to Execute() Policy .Handle<SomeExceptionType>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3) }, (exception, timeSpan, retryCount, context) => { // Add logic to be executed before each retry, such as logging }); // Retry a specified number of times, using a function to // calculate the duration to wait between retries based on // the current retry attempt (allows for exponential backoff) // In this case will wait for // 2 ^ 1 = 2 seconds then // 2 ^ 2 = 4 seconds then // 2 ^ 3 = 8 seconds then // 2 ^ 4 = 16 seconds then // 2 ^ 5 = 32 seconds Policy .Handle<SomeExceptionType>() .WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) ); // Retry a specified number of times, using a function to // calculate the duration to wait between retries based on // the current retry attempt, calling an action on each retry // with the current exception, duration and context provided // to Execute() Policy .Handle<SomeExceptionType>() .WaitAndRetry( 5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (exception, timeSpan, context) => { // Add logic to be executed before each retry, such as logging } ); // Retry a specified number of times, using a function to // calculate the duration to wait between retries based on // the current retry attempt, calling an action on each retry // with the current exception, duration, retry count, and context // provided to Execute() Policy .Handle<SomeExceptionType>() .WaitAndRetry( 5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (exception, timeSpan, retryCount, context) => { // Add logic to be executed before each retry, such as logging } );
開源地址:
https://github.com/App-vNext/Polly
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/180052.html
標籤:ASP.NET MVC
下一篇:如何寫一段死鎖代碼
