retryer实现接口重试机制
retryer实现接口重试机制
在日常开发中,经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般是不靠谱的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候需要使用失败重试调用API接口来获取。 需要再引入guava-retrying包 com.github.rholder guava-retrying 2.0.0 实现代码示例如下: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); } }