2016-04-04 18 views
3

Geçici hata işleme için Polly framework kullanıyorum. Eşzamanlı işlemler için Polly devre kesici politikası iyi çalışır, ancak uyumsuz sürümünü oluşturduğumda yürütmeyi tekrar denemez. Lütfen göstermektedir:Polly framework CircuitBreakerAsync, istisna oluşursa yeniden deneme yapmaz.

Asenkron yöntemi:

private static void AsyncDemo3(Func<Task> action) 
    { 
     programStartTime = DateTime.Now; 

     Policy policy = Policy 
      .Handle<TimeoutException>() 
      .CircuitBreakerAsync(3, TimeSpan.FromSeconds(2)); 
     try 
     { 
      var a = policy.ExecuteAndCaptureAsync(action, true).GetAwaiter().GetResult(); 
     } 
     catch (AggregateException ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
    } 

Polly devre kesici ilkesi yürütülmesi:

private async static Task HelloWorld() { if (DateTime.Now < programStartTime.AddSeconds(10)) { Console.WriteLine("Task Failed."); throw new TimeoutException(); } await Task.Delay(TimeSpan.FromSeconds(1)); Console.WriteLine("Task Completed."); } 

Polly devre kesici uyumsuz ilkesi

AsyncDemo3 (MerhabaDünya);

Sorunu bulmanıza ve çözmenize yardımcı olun.

cevap

7

Devre kesici politikasının ne yaptığını yanlış anladığınızı düşünüyorum.

Bu, sizin sizin için belirtilen sayıda ve her seferinde başarısız olursa, belirli bir süre için verilen yöntemi çağırmayı durduracaktır. Ama kendi başına tekrar denemez.

Yapmak istediğinizi düşündüğüm şeyi yapmak için, yeniden deneme ilkesini devre kesici ilkesiyle birleştirmeniz gerekir. Bunu yapmanın bir yolu olurdu:

Policy retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3); 

Policy circuitBreakerPolicy = Policy 
    .Handle<TimeoutException>() 
    .CircuitBreakerAsync(3, TimeSpan.FromSeconds(2)); 

try 
{ 
    retryPolicy.ExecuteAsync(() => circuitBreakerPolicy.ExecuteAsync(action, true)) 
     .GetAwaiter().GetResult(); 
} 
… 

bu kodun çıktısı:

Task Failed. 
Task Failed. 
Task Failed. 
Exception: The circuit is now open and is not allowing calls. 
+0

Polly da artık [PolicyWrap] eklendi (https://github.com/App-vNext/Polly/wiki/PolicyWrap) politikaları daha da kısa bir şekilde birleştirmek için sözdizimi yapabilir: 'retryPolicy.WrapAsync (circuitBreakerPolicy) .ExecuteAsync (...)' –

İlgili konular