使用Polly库实现重试逻辑,无需反复进行异常处理

9

如何使用 Polly 实现重试逻辑,无限次地重试执行一个函数并添加延迟,但不处理任何异常。场景是重复获取状态信息,但没有预期的异常。

2个回答

10
Polly并非设计为一个Cron-job工具,故刻意不针对该用例。Polly的重试聚焦于单个操作的弹性(重试到成功)而非反复调用那些做成功的事情。
其他可选项(如果有用):

如果两次执行之间的延迟足够长,您希望在执行之间释放执行资源(线程或堆栈),请考虑:


如果延迟足够小(比如每5秒钟一次),不值得释放和重新获取执行资源,则可以使用具有延迟的无限循环。例如,如果是异步的:
while (true)
{
    // Do my repeated work

    await Task.Delay(TimeSpan.FromSeconds(5));
}

如果您想要取消(优雅地结束一个程序),当然可以通过添加取消功能来实现:

// for some CancellationToken cancellationToken
while (!cancellationToken.IsCancellationRequested)
{
    // Do my repeated work

    await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
}

像HangFire这样的定期作业调度器的一个优点是,如果其中一个执行崩溃了,下一个计划的调用仍然会运行。无论您选择什么解决方案,都应该考虑一下如果一个周期性作业执行失败后你希望发生什么。


这只是一些选项。其他人也可以添加自己喜欢的选项。 - mountain traveller
Polly中流畅的语法应该足够灵活,以处理这种情况。 - TrustyCoder
1
@TrustyCoder 我之前发布的编辑/评论建议使用.Handle<Exception>(e => false)是不正确的;它不会多次调用成功的任务。Polly的重试架构旨在重试单个操作以实现成功,而不是重复调用已成功的事物。我猜测Polly团队不太可能将Polly扩展为cron作业工具,因为这开始超出了Polly对弹性的核心关注点 - 并且还有其他cron作业类型的解决方案可用。感谢您的问题,这有助于澄清这个维度。 - mountain traveller

9

你最好使用像Hangfire这样专门用于CRON jobs的工具。

但是如果你真的想使用Polly,以下是如何操作:

 await Policy
            .HandleResult<bool>(c => c == false)  //you can add other condition
            .WaitAndRetryForeverAsync(i => TimeSpan.FromMinutes(i))
            .ExecuteAsync(async () =>
            {
                await DoSomethingAsync();
                return true;  //return false to stop execution
            });

https://github.com/App-vNext/Polly/wiki/Retry#retry-to-refresh-authorization


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接