trycatch块中的java递归调用以重试N次
我有一个常规的、非静态的sendMail
方法,它偶尔会失败。我需要捕获任何错误并重试该方法N次。我不确定我做的是否正确,还有一个编译错误:
public void sendMail(List<String> params) {
try {
//...
static int retrycount = 0; // static not allowed here (but need to keep static var for recursion)
int maxretries = 3;
}
catch (Exception e) {
log.info(e);
// Recursion to retry
sendMail(params);
retrycount++;
}
}
首先,来自try/catch块的递归是否正确?还有,有没有更好的方法
我不能使sendMail
方法成为静态的,现有代码中有太多对它的引用
# 1 楼答案
标准的递归解决方案是将
retryCount
添加为参数循环将是更惯用的写作方式
按照原始问题的精神,
retryCount
可以作为一个字段保存在引入的对象中。使用匿名内部类最容易做到这一点(如果有点晦涩)# 2 楼答案
如果您只是将代码包装在重试循环中会怎么样:
# 3 楼答案
您的重试从一开始就不会起作用,因为在每个try块中,您都将retrycount设置为0
您最好抛出异常,而不是捕获它。然后使用某种while循环直到完成,可能在重试之间有一个可配置的延迟。或者,如果您使用的是Spring,则有
Retryable
注释这个解决方案比使用递归要干净得多,因为如果您想多次重试,最终会出现堆栈溢出错误。它还使sendMail函数的响应保持简单,并避免向其他简单方法中添加复杂的重试逻辑
此外,如果您最终不得不以相同的方式使其他方法可重试,那么将重试逻辑抽象为某种执行器服务将更容易