我正在尝试使用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并仅打印“对象引用未设置为对象的实例”。
预期:
要从断开的电路异常中打印对象引用未设置为对象实例的三次和消息
最佳答案
我相信您误解了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,以简化合并策略。