问题描述
在 Jenkins Pipeline 中,通过 retry 函数,能够对某个操作重复进行,直到成功。尤其是在网络请求中,我们更应该使用 retry 函数,以防止服务器负载过高而产生的临时失败。
但是,Jenkins Pipeline 的执行速度“较慢”(这是 Jenkins 的优化,防治对服务器产生过大压力),并且会大量产生 Pipeline Step 执行日志,因此我们希望通过 Groovy 实现 retry 函数,并加入一些特性。
该笔记将记录:在 Apache Groovy 中,如何实现自定义的 retry 函数,以及相关问题处理。
解决方案
代码 retry() 示例
def retry(int times = 5, Closure errorHandler = {e-> e.printStackTrace()}, Closure body) { int retries = -1 while(times < 0 || ++retries <= times) { try { return body.call() } catch(e) { errorHandler.call(e) } } throw new Exception("Failed after $times retries!") }
这里的代码也许写的比较罗嗦,我们是为了赋予三个区间含义:
1)如果重试次数小于零,将无限重试;
2)如果重试次数等于零,将执行一次(而不重试)。
3)如果重试次数大于零,将执行 times + 1 次(即重试 times 次)
使用示例
retry(3) { errorProneOperation() } retry(2, {e-> e.printStackTrace()}) { errorProneOperation() }
相关文章
「Groovy」- 找到调用该方法的类
「Groovy」- 将对象保存到文件,以及读取文件中对象
参考文献
java - Retry after Exception in Groovy - Stack Overflow
Pipeline: Basic Steps/retry