重试在项目中还是比较常见的一个场景,比如调用外部服务因为网络等原因的异常,重试一次可能就成功了,而不需要立即给用户反馈错误,提高体验
假设我们自己来写一个最简单异常重试的话,可能代码是这样子的
1 | int retryTime = 3; |
这里可能有几个问题需要考虑
- 不仅仅是异常需要重试,有时接口返回的特定错误码也是需要重试的
- 不是所有的异常都可以重试,需要根据情况判断异常原因才能重试
- 有时失败不能立即重试,需要等待一小段时间,比如短时网络波动
- 重试停止不一定只需要次数,有时也需要判断整体用的时间等因素
这么一看,需要考虑的地方还挺多,而重试功能又是一个非常通用的功能,所以完全可以包装一下做成通用的能力
而这个目前已经有一些现成的工具供我们使用,这次我们就先看下 guava-retrying