背景
后端业务系统可能会在接口调用失败、网络拥塞超时、任务执行失败、系统错误等异常情况出现的时候进行重试操作,然而不同的场景对于重试的延迟间隔,频次等会有不同的要求,如果自己编排重试代码会比较繁琐,使用 guava-retrying 可以帮我们灵活实现重试机制。
guava-retrying简介
guava-retrying 是一个线程安全的 Java 重试类库,提供了一种通用方法去处理任意需要重试的代码,可以方便灵活地控制重试次数、重试时机、重试频率、停止时机等,并具有异常处理功能
使用
1、dependency
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>2.0.0</version>
</dependency>
2、定义重试器
两个重试器例子
重试器 retryer1: 失败后一直重试,以菲波纳耶数列设置重试等待间隔,直到间隔为1000s,然后以1000s为间隔重不断试
java
private Retryer<Void> retryer1 = RetryerBuilder.<Void>newBuilder()
.retryIfExceptionOfType(Throwable.class) // 如果出现Throwable异常则重试
.withWaitStrategy(WaitStrategies.fibonacciWait(100, TimeUnit.SECONDS)) // 等待重试策略
.withStopStrategy(StopStrategies.neverStop()) // 停止策略
.build();
重试器 retryer2:重试3次后抛出异常,每次重试间隔等待300毫秒
java
private Retryer<Void> retryer2 = RetryerBuilder.<Void>newBuilder()
.retryIfExceptionOfType(Throwable.class)
.withWaitStrategy(WaitStrategies.fixedWait(300, TimeUnit.MILLISECONDS))
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.build();
参数定义
- retryIfExceptionOfType():重试条件,另外还有 retryIfResult,retryIfRuntimeException
- withWaitStrategy:重试等待策略
- withStopStrategy:重试停止策略
- 阻塞策略、超时限制、注册重试监听器(上述简易重试器未涉及到)
3、使用
retryer.call(() -> {
log.info("重试方法被调用");
if (1 == 1) {
throw new RuntimeException("重试错误");
}
return null;
});