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

时间:2016-03-23 11:08:29

标签: c# circuit-breaker polly

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

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异常。

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

预期: 打印对象引用未设置为对象实例三次和来自断开电路异常的消息

1 个答案:

答案 0 :(得分:4)

我相信您误解了CircuitBreaker政策的作用,正如此类似问题所述:Polly framework CircuitBreakerAsync does not retry if exception occur

断路器本身并不能重新进行任何重试。相反,存在测量通过它执行的代表的故障率 - 并且如果故障率变得太高则使电路跳闸。由于它的目的只是作为一个测量 - 并且正在破坏的设备,它确实重新抛出了通过它执行的代理的异常:因此你看到了NullReferenceException被重新抛出。

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

要执行我认为您想要执行的操作,您需要将重试策略与断路器策略结合使用,如Polly framework CircuitBreakerAsync does not retry if exception occur所述。 Polly现在提供PolicyWrap来简化组合策略。