Polly断路器模式-用于测试连接线

Dev*_*Dev 1 c# circuit-breaker polly

我正在尝试使用Polly测试连接字符串是否为null。如果为空,我想使用CircuitBreaker尝试三遍,并且该消息应该在控制台窗口中输出。

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);               
      }     
Run Code Online (Sandbox Code Playgroud)

和GetConnectionString方法是:

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

为了对此进行测试,我在App.config中更改了连接字符串名称。

但是,它似乎没有处理NullReference Exception。

当我调试应用程序时-它将打开未找到的CircuitBreakerEngine.cs并仅打印“对象引用未设置为对象的实例”。

预期的:从断路异常中打印未将对象引用设置为对象实例三次的消息

mou*_*ler 5

我相信您已经误解了该CircuitBreaker策略的作用,如以下类似问题所述:如果发生异常,Polly框架CircuitBreakerAsync不会重试

断路器本身不会安排任何重试。相反,它存在的目的是测量通过它执行的代表的故障率-如果故障率变得过高,则使电路跳闸。因为它的目的仅是作为一种测量和破坏设备,所以它确实抛出了通过它执行的委托的异常:因此,NullReferenceException您看到的是重新抛出的异常。

编辑:断路器的这种行为及其与重试的区别,也可以在以下Polly Wiki中清楚地描述:https : //github.com/App-vNext/Polly/wiki/Circuit-Breaker

要执行我想做的事情,您需要将重试策略与断路器策略结合起来,如Polly框架中所述,如果发生异常,CircuitBreakerAsync不重试。Polly现在提供PolicyWrap,使合并策略变得容易。