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并仅打印“对象引用未设置为对象的实例”。
预期的:从断路异常中打印未将对象引用设置为对象实例三次的消息
我相信您已经误解了该CircuitBreaker策略的作用,如以下类似问题所述:如果发生异常,Polly框架CircuitBreakerAsync不会重试
断路器本身不会安排任何重试。相反,它存在的目的是测量通过它执行的代表的故障率-如果故障率变得过高,则使电路跳闸。因为它的目的仅是作为一种测量和破坏设备,所以它确实抛出了通过它执行的委托的异常:因此,NullReferenceException您看到的是重新抛出的异常。
编辑:断路器的这种行为及其与重试的区别,也可以在以下Polly Wiki中清楚地描述:https : //github.com/App-vNext/Polly/wiki/Circuit-Breaker
要执行我想做的事情,您需要将重试策略与断路器策略结合起来,如Polly框架中所述,如果发生异常,CircuitBreakerAsync不重试。Polly现在提供PolicyWrap,使合并策略变得容易。