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() .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中我更改了连接字符串名称。

但它似乎没有处理NullReferenceexception。

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

预期:打印对象引用未设置为对象实例的三次和来自Broken circuit Exception的消息

我相信你误解了CircuitBreaker政策的作用,如同类似问题所述: 如果发生exception,Polly框架CircuitBreakerAsync不会重试

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

编辑 :断路器的这种行为,以及它与重试的区别,也在Polly维基中有清楚描述,请访问: https : //github.com/App-vNext/Polly/wiki/Circuit-Breaker

要执行我认为您想要执行的操作,您需要将重试策略与断路器策略结合使用,如Polly框架所述, 如果发生exception,CircuitBreakerAsync不会重试 。 Polly现在提供PolicyWrap以简化组合策略。