在接口调用中由于各种原因,可能会重置失败的任务,使用Guava-Retrying可以方便的实现重试功能。
首先,需要引用Guava-Retrying的包
com.github.rholder
guava-retrying
2.0.0
代码示例:
public class RetryDemo {
public static void main(String[] args) {
Retryer retryer = RetryerBuilder.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{
public Boolean call() throws Exception {
return false;
}
}
另外,MyRetryListener监听实现了RetryListener接口,每次重试都会回调注册的监听
public class MyRetryListener implements RetryListener {
public void onRetry(Attempt 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设置,同时支持多个且能兼容。retryIfResult可以指定你的Callable方法在返回值的时候进行重试
StopStrategy:停止重试策略,提供三种:
StopAfterDelayStrategy 设定一个最长允许的执行时间;比如设定最长执行10s,无论任务执行次数,只要重试的时候超出了最长时间,则任务终止,并返回重试异常RetryException。
NeverStopStrategy 不停止,用于需要一直轮训知道返回期望结果的情况。
StopAfterAttemptStrategy 设定最大重试次数,如果超出最大重试次数则停止重试,并返回重试异常。
WaitStrategy:等待时长策略(控制时间间隔),返回结果为下次执行时长: