「Apache Groovy」- 编写 retry 函数

  CREATED BY JENKINSBOT

问题描述

在 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()
}

参考文献

java – Retry after Exception in Groovy – Stack Overflow
Pipeline: Basic Steps/retry