弹性和瞬态故障处理库Polly
源码及参考见文章底部
Nuget中Polly库的引用:
Install-Package Polly
以下策略调用的方法:
详细代码见
public static int random = 10;
public static int DivideByZero(int random)
{
//int a = 0;
if (random != 25) random = 0;
return 100 / random;
}
Retry策略
public static void Retry()
{
var retry = Policy
.Handle<DivideByZeroException>()
.Retry(3, (exception, retryCount) =>
{
Console.WriteLine($"执行异常,重试次数:{retryCount},【异常来自:{exception.GetType().Name}】.");
});
retry.Execute(() => { DivideByZero(random); });
}
结果:
WaitAndRetry策略
public static void WaitAndRetry()
{
var retry = Policy
.Handle<DivideByZeroException>()
.WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(1, retryAttempt)),
(exception, timespan, retryCount, context) =>
{
Console.WriteLine($"重试,[当前随机数为{random}] [retrycount{retryCount}] [异常来自:{exception.GetType().Name}] [{timespan}]");
random = new Random().Next(10, 50);
if (random == 25)
Console.WriteLine($"成功,随机数为{random}");
});
retry.Execute(() => DivideByZero(random));
}
结果:
WaitandRetryForeverUntilSuccess策略
public static void WaitandRetryForeverUntilSuccess()
{
var retryForever = Policy
.Handle<DivideByZeroException>()
.WaitAndRetryForever(retryAttempt => TimeSpan.FromSeconds(Math.Pow(1, retryAttempt)), (exception, timespan) =>
{
Console.WriteLine($"重试,[当前随机数为{random}][异常来自:{exception.GetType().Name}] [{timespan}]");
random = new Random().Next(10, 50);
if (random == 25)
Console.WriteLine($"成功,随机数为{random}");
});
retryForever.Execute(() => { DivideByZero(random); });
}
结果: