1

Polly を使用して接続文字列が null かどうかをテストしようとしています。null の場合、CircuitBreaker を使用して 3 回試行し、コンソール ウィンドウにメッセージが出力されるはずです。

Policy policy = null;

// Break the circuit after the specified number of exceptions
// and keep circuit broken for the specified duration.
policy = Policy
               .Handle<NullReferenceException>()
               .CircuitBreaker(3, TimeSpan.FromSeconds(30)); 
try
   {
     string connected = policy.Execute(() => repository.GetConnectionString());
   }

catch (Exception ex)
      {
         Console.WriteLine("{0}",ex.Message);               
      }     

GetConnectionString メソッドは次のとおりです。

public string GetConnectionString()
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = ConfigurationManager.ConnectionStrings["Test1"].ConnectionString;
        return conn.ConnectionString;
    }

これをテストするために、App.config で接続文字列名を変更しました。

ただし、NullReference Exception を処理していないようです。

アプリケーションをデバッグすると、CircuitBreakerEngine.cs が見つからず、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」のみが表示されます。

予想される : オブジェクト参照がオブジェクトのインスタンスに設定されていないことを 3 回出力し、壊れた回路の例外からメッセージを出力する

4

1 に答える 1

5

CircuitBreakerこの同様の質問で説明されているように、ポリシーの機能を誤解していると思います: Polly framework CircuitBreakerAsync is not retry if exception occured

サーキット ブレーカー自体は再試行を調整しません。むしろ、それを介して実行されたデリゲートの障害率を測定し、障害率が高くなりすぎた場合に回路をトリップするために存在します。その目的は測定と破壊のデバイスとしてのみであるため、それを介して実行されたデリゲートからの例外を実際に再スローします。したがって、再スローNullReferenceExceptionが見られます。

編集: サーキット ブレーカーのこの動作と、再試行との違いは、Polly wiki ( https://github.com/App-vNext/Polly/wiki/Circuit-Breaker ) でも明確に説明されています。

あなたがやりたいと思うことを行うには、Polly framework CircuitBreakerAsync does not retry if exception occured で説明されているように、再試行ポリシーとサーキット ブレーカー ポリシーを組み合わせる必要があります。Polly は、ポリシーの結合を容易にするPolicyWrapを提供するようになりました。

于 2016-05-08T15:02:35.863 に答える