「Apache Groovy」- 编写 retry 函数 @20210426

问题描述

在 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


posted @ 2021-04-26 18:20  研究林纳斯写的  阅读(118)  评论(0编辑  收藏  举报