弹性和瞬态故障处理库Polly之重试策略

弹性和瞬态故障处理库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); });
}

结果:
这里写图片描述

参考:Github-Polly以及Jeffcky的博客

源码: Github

猜你喜欢

转载自blog.csdn.net/zhaobw831/article/details/78132757