## 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);