## retryer实现接口重试机制
在日常开发中,经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般是不靠谱的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候需要使用失败重试调用API接口来获取。
### 需要再引入guava-retrying包
com.github.rholder
guava-retrying
2.0.0
### 实现代码示例如下:
```java
package com.watson.traffic.blog.trafficblog.sevice;
import com.github.rholder.retry.*;
import com.google.common.base.Predicates;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
* @author watson
* @date 2021/7/7 15:33
* @Description: TODO
@Slf4j
public class ert {
public static void main(String[] args) throws Exception {
Retryer retryer = RetryerBuilder.newBuilder()
// 设置自定义段元重试源
.retryIfResult(Predicates.isNull())
// 设置异常重试源
.retryIfExceptionOfType(Exception.class)
// 设置异常重试源
.retryIfRuntimeException()
// 设置重试次数 设置重试超时时间????
.withStopStrategy(StopStrategies.stopAfterAttempt(5))
// 设置每次重试间隔
.withWaitStrategy(WaitStrategies.fixedWait(5L, TimeUnit.SECONDS))
.build();
Callable task = new Callable() {
int i = 0;
@Override
public Boolean call() throws Exception {
i++;
log.info("第{}次执行!", i);
if (i < 3) {
log.info("模拟执行失败");
throw new IOException("异常");
return true;
try {
retryer.call(task);
} catch (ExecutionException e) {
log.error("error", e);
} catch (RetryException e) {
log.error("error", e);
Boolean result = task.call();
log.info("成功输出结果:{}", result);
热门跟贴