我正在尝试使用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并仅打印“对象引用未设置为对象的实例”。
预期: 打印对象引用未设置为对象实例三次和来自断开电路异常的消息
答案 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来简化组合策略。