重试Guava Retrying

一、使用场景

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

Guava Retrying 是一个灵活方便的重试组件,包含了多种的重试策略,而且扩展起来非常容易。使用 Guava-retrying 你可以自定义来执行重试,同时也可以监控每次重试的结果和行为,最重要的基于 Guava 风格的重试方式真的很方便。

 

二、代码示例

引入依赖

<dependency>

<groupId>com.github.rholder</groupId>

<artifactId>guava-retrying</artifactId>

<version>2.0.0</version>

</dependency>

 

以下会简单列出 guava-retrying 的使用方式:

如果抛出 IOException 则重试,如果返回结果为 null 或者等于 2 则重试,固定等待时长为 300 ms,最多尝试 3 次;

Callable<Integer> task = new Callable<Integer>() {

@Override

public Integer call() throws Exception {

return 2;

}

};

 

Retryer<Integer> retryer = RetryerBuilder.<Integer>newBuilder()

.retryIfResult(Predicates.<Integer>isNull())

.retryIfResult(Predicates.equalTo(2))

.retryIfExceptionOfType(IOException.class)

.withStopStrategy(StopStrategies.stopAfterAttempt(3))

.withWaitStrategy(WaitStrategies.fixedWait(300, TimeUnit.MILLISECONDS))

.build();

try {

retryer.call(task);

} catch (ExecutionException e) {

e.printStackTrace();

} catch (RetryException e) {

e.printStackTrace();

}

 

出现异常则执行重试,每次任务执行最长执行时间限定为 3 s,重试间隔时间初始为 3 s,最多重试 1 分钟,随着重试次数的增加每次递增 1 s,每次重试失败,打印日志;

@Override

public Integer call() throws Exception {

return 2;

}

};

 

Retryer<Integer> retryer = RetryerBuilder.<Integer>newBuilder()

.retryIfException()

.withStopStrategy(StopStrategies.stopAfterDelay(30,TimeUnit.SECONDS))

.withWaitStrategy(WaitStrategies.incrementingWait(3, TimeUnit.SECONDS,1,TimeUnit.SECONDS))

.withAttemptTimeLimiter(AttemptTimeLimiters.<Integer>fixedTimeLimit(3,TimeUnit.SECONDS))

.withRetryListener(new RetryListener() {

@Override

public <V> void onRetry(Attempt<V> attempt) {

if (attempt.hasException()){

attempt.getExceptionCause().printStackTrace();

}

}

})

.build();

try {

retryer.call(task);

} catch (ExecutionException e) {

e.printStackTrace();

} catch (RetryException e) {

e.printStackTrace();

}

 

 

四、主要接口介绍:

1、Attempt:一次执行任务;

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

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

4、RetryException:重试异常;

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

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

StopAfterDelayStrategy :设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException; NeverStopStrategy :不停止,用于需要一直轮训知道返回期望结果的情况; StopAfterAttemptStrategy :设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常;

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

FixedWaitStrategy:固定等待时长策略; RandomWaitStrategy:随机等待时长策略(可以提供一个最小和最大时长,等待时长为其区间随机值) IncrementingWaitStrategy:递增等待时长策略(提供一个初始值和步长,等待时间随重试次数增加而增加) ExponentialWaitStrategy:指数等待时长策略; FibonacciWaitStrategy :Fibonacci 等待时长策略; ExceptionWaitStrategy :异常时长等待策略; CompositeWaitStrategy :复合时长等待策略;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值