千家信息网

什么是Guava-Retryer

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,什么是Guava-Retryer,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在日常开发中,我们经常会遇到需要调用外部服务和接口的场
千家信息网最后更新 2026年11月01日什么是Guava-Retryer

什么是Guava-Retryer,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活(Active)。

Guava Retrying是一个灵活方便的重试组件,包含了多种的重试策略,而且扩展起来非常容易。

用作者的话来说:

This is a small extension to Google's Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.

使用Guava-retrying你可以自定义来执行重试,同时也可以监控每次重试的结果和行为,最重要的基于 Guava 风格的重试方式真的很方便。

代码示例

  • 引入Guava-retry

2.0.0      com.github.rholder      guava-retrying      ${guava-retry.version}
  • 定义实现Callable接口的方法,以便Guava retryer能够调用

package org.java.base.retry;import java.io.IOException;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.github.rholder.retry.RetryException;import com.github.rholder.retry.Retryer;import com.github.rholder.retry.RetryerBuilder;import com.github.rholder.retry.StopStrategies;import com.github.rholder.retry.WaitStrategies;import com.google.common.base.Predicates;public class RetryTest { private static final Logger logger = LoggerFactory.getLogger(RetryTest.class); public static void main(String[] args){  Retryer retryer = RetryerBuilder.newBuilder() .retryIfResult(Predicates.isNull())// 设置自定义段元重试源 .retryIfExceptionOfType(Exception.class)// 设置异常重试源 .retryIfRuntimeException()// 设置异常重试源 .withStopStrategy(StopStrategies.stopAfterAttempt(5))// 设置重试5次,同样可以设置重试超时时间 .withWaitStrategy(WaitStrategies.fixedWait(5L, TimeUnit.SECONDS))// 设置每次重试间隔,5秒 .build(); try { retryer.call(new Callable() { int i = 0; @Override public Boolean call() throws Exception { i++; logger.info("第{}次执行!", i); // do something if (i<6) {// 模拟错2次 logger.info("模拟执行失败!"); throw new IOException("异常"); } logger.info("模拟执行成功!"); return true;  } }); } catch (RetryException e) { logger.info("超过重试次数", e); } catch (ExecutionException e) { logger.info("重试框架异常", e); } }}

简单三步就能使用Guava Retryer优雅的实现重调方法。
接下来对其进行详细说明:

  • RetryerBuilder是一个factory创建者,可以定制设置重试源且可以支持多个重试源,可以配置重试次数或重试超时时间,以及可以配置等待时间间隔,创建重试者Retryer实例。

  • RetryerBuilder的重试源支持Exception异常对象 和自定义断言对象,通过retryIfException 和retryIfResult设置,同时支持多个且能兼容。

  • retryIfException,抛出runtime异常、checked异常时都会重试,但是抛出error不会重试。

  • retryIfRuntimeException只会在抛runtime异常的时候才重试,checked异常和error都不重试。

  • retryIfExceptionOfType允许我们只在发生特定异常的时候才重试,比如NullPointerException和IllegalStateException`都属于runtime异常,也包括自定义的error

如:

.retryIfExceptionOfType(Error.class)// 只在抛出error重试

当然我们还可以在只有出现指定的异常的时候才重试,如:

.retryIfExceptionOfType(IllegalStateException.class)  .retryIfExceptionOfType(NullPointerException.class)

或者通过Predicate实现

.retryIfException(Predicates.or(Predicates.instanceOf(NullPointerException.class),                  Predicates.instanceOf(IllegalStateException.class)))

retryIfResult可以指定你的Callable方法在返回值的时候进行重试,如

// 返回false重试 .retryIfResult(Predicates.equalTo(false))  //以_error结尾才重试 .retryIfResult(Predicates.containsPattern("_error$"))

运行结果如下:

主要接口及策略介绍:

Attempt:一次执行任务;

AttemptTimeLimiter:单次任务执行时间限制(如果单次任务执行超时,则终止执行当前任务);

BlockStrategies:任务阻塞策略(通俗的讲就是当前任务执行完,下次任务还没开始这段时间做什么……),默认策略为:BlockStrategies.THREAD_SLEEP_STRATEGY 也就是调用 Thread.sleep(sleepTime);

RetryException:重试异常;

RetryListener:自定义重试监听器,可以用于异步记录错误日志;

StopStrategy:停止重试策略,提供三种:

  • StopAfterDelayStrategy :设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException;

  • NeverStopStrategy :不停止,用于需要一直轮训知道返回期望结果的情况;

  • StopAfterAttemptStrategy :设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常;

WaitStrategy:等待时长策略(控制时间间隔),返回结果为下次执行时长:

  • FixedWaitStrategy:固定等待时长策略;

  • RandomWaitStrategy:随机等待时长策略(可以提供一个最小和最大时长,等待时长为其区间随机值)

  • IncrementingWaitStrategy:递增等待时长策略(提供一个初始值和步长,等待时间随重试次数增加而增加)

  • ExponentialWaitStrategy:指数等待时长策略;

  • FibonacciWaitStrategy :Fibonacci 等待时长策略;

  • ExceptionWaitStrategy :异常时长等待策略;

  • CompositeWaitStrategy :复合时长等待策略;

关于什么是Guava-Retryer问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

策略 时长 任务 时间 次数 时候 接口 方法 结果 服务 最大 最长 情况 问题 支持 同时 多个 对象 更多 网络 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 互联网与科技发展 互联网金融公司科技 以房互联网科技 中国互联网科技发展 电子科技大学互联网 北京禾田雨橡互联网科技 老年人脱离互联网科技的作文 阿里巴巴算科技企业还是互联网 哈尔滨屹滨互联网科技有限公司 米聚互联网科技南京有限公司排面 互联网公司黑科技创始人 互联网在线教育科技创业 互联网科技创新的路径 四川慕妮娅互联网科技有限公司 广西科技产业互联网是什么 互联网科技新闻 广州三三互联网科技有限公司 宁波允成互联网科技有限公司 互联网高科技绘画 江苏根荣互联网科技 互联网科技公司的优势 互联网品科技 科技与互联网发展 湖南洣水互联网科技有限公司扣款 电子商务与互联网科技的关系 银川新华互联网科技学校是国营吗 玉溪新华互联网科技怎么选 互联网科技大会大佬 互联网大会出现的黑科技
0