Guava-Retrying实现重试机制
2018-06-28 23:34
357 查看
在接口调用中由于各种原因,可能会重置失败的任务,使用Guava-Retrying可以方便的实现重试功能。
首先,需要引用Guava-Retrying的包
<dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version> </dependency>代码示例:
public class RetryDemo { public static void main(String[] args) { Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder(). //如果异常会重试 retryIfException(). //如果结果为false会重试 retryIfResult(Predicates.equalTo(false)). //重调策略 withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS)). //尝试次数 withStopStrategy(StopStrategies.stopAfterAttempt(3)). //注册监听 withRetryListener(new MyRetryListener()).build(); try { retryer.call(new TaskCallable()); } catch (Exception e) { e.printStackTrace(); } } }其中TaskCallable是任务的具体实现类,它实现了Callable接口
public class TaskCallable implements Callable<Boolean>{ public Boolean call() throws Exception { return false; } }另外,MyRetryListener监听实现了RetryListener接口,每次重试都会回调注册的监听
public class MyRetryListener implements RetryListener { public <V> void onRetry(Attempt<V> attempt) { System.out.print("[retry]time=" + attempt.getAttemptNumber()); // 距离第一次重试的延迟 System.out.print(",delay=" + attempt.getDelaySinceFirstAttempt()); // 重试结果: 是异常终止, 还是正常返回 System.out.print(",hasException=" + attempt.hasException()); System.out.print(",hasResult=" + attempt.hasResult()); // 是什么原因导致异常 if (attempt.hasException()) { System.out.print(",causeBy=" + attempt.getExceptionCause().toString()); } else { // 正常返回时的结果 System.out.print(",result=" + attempt.getResult()); } System.out.println(); } }执行一下main方法,可以看到执行的结果:
[retry]time=1,delay=0,hasException=false,hasResult=true,result=false [retry]time=2,delay=10001,hasException=false,hasResult=true,result=false [retry]time=3,delay=20002,hasException=false,hasResult=true,result=false com.github.rholder.retry.RetryException: Retrying failed to complete successfully after 3 attempts. at com.github.rholder.retry.Retryer.call(Retryer.java:174) at org.thinking.java.base.guava.retrying.RetryDemo.main(RetryDemo.java:26)下面详细分析一下:
RetryerBuilder是一个factory创建者,可以定制设置重试源且可以支持多个重试源,可以配置重试次数或重试超时时间,以及可以配置等待时间间隔,创建重试者Retryer实例。
RetryerBuilder的重试源支持Exception异常对象 和自定义断言对象,通过retryIfException 和retryIfResult设置,同时支持多个且能兼容。retryIfException,抛出runtime异常、checked异常时都会重试,但是抛出error不会重试。
retryIfRuntimeException只会在抛runtime异常的时候才重试,checked异常和error都不重试。
retryIfExceptionOfType允许我们只在发生特定异常的时候才重试,比如NullPointerException和IllegalStateException都属于runtime异常,也包括自定义的error
retryIfResult可以指定你的Callable方法在返回值的时候进行重试
StopStrategy:停止重试策略,提供三种:
StopAfterDelayStrategy 设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException。
NeverStopStrategy 不停止,用于需要一直轮训知道返回期望结果的情况。
StopAfterAttemptStrategy 设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常。
WaitStrategy:等待时长策略(控制时间间隔),返回结果为下次执行时长:FixedWaitStrategy 固定等待时长策略。
RandomWaitStrategy 随机等待时长策略(可以提供一个最小和最大时长,等待时长为其区间随机值)。
IncrementingWaitStrategy 递增等待时长策略(提供一个初始值和步长,等待时间随重试次数增加而增加)。
ExponentialWaitStrategy 指数等待时长策略。
FibonacciWaitStrategy Fibonacci 等待时长策略。
ExceptionWaitStrategy 异常时长等待策略。
CompositeWaitStrategy 复合时长等待策略。 阅读更多
相关文章推荐
- guava-retrying实现业务逻辑重试
- Guava类库中的Multisets的实现机制源码分析
- guava-retrying重试工具库: 隔多长时间重试
- guava-retrying重试工具库: AttemptTimeLimiter
- 使用Guava retryer实现延时重试机制
- RxJava retryWhen操作符实现错误重试机制
- Retrofit+Rxjava服务器IP轮询重试机制实现
- guava-retrying重试工具库: 什么时候终止
- Guava retryer优雅的实现接口重调机制
- RxJava(六) retryWhen操作符实现错误重试机制
- node.js重试机制的简单实现
- guava-retrying重试工具库: 阻塞策略BlockStrategy
- RxJava retryWhen操作符实现错误重试机制
- guava-retrying,重试工具使用
- guava-retrying重试工具库: RetryListener
- Java 中实现方法重试的一种机制
- java调度器(重试机制)实现
- Spring错误异常重试框架guava-retrying
- RxJava retryWhen操作符实现错误重试机制
- python爬虫URL重试机制实现(python2.7以及python3.5)