Java基于Guava Retrying实现重试功能
在接口调用中由于各种原因,可能会重置失败的任务,使用Guava-Retrying可以方便的实现重试功能。
首先,需要引用Guava-Retrying的包
com.github.rholder guava-retrying 2.0.0 
代码示例:
importcom.github.rholder.retry.Retryer;
importcom.github.rholder.retry.RetryerBuilder;
importcom.github.rholder.retry.StopStrategies;
importcom.google.common.base.Predicates;
importjava.util.concurrent.TimeUnit;
importstaticcom.github.rholder.retry.WaitStrategies.incrementingWait;
/**
*@authorwangxuexing
*@descrption
*@date
*/
publicclassRetryDemo{
publicstaticvoidmain(String[]args){
Retryerretryer=RetryerBuilder.newBuilder().
//如果异常会重试
retryIfException().
//如果结果为false会重试
retryIfResult(Predicates.equalTo(false)).
//重调策略
withWaitStrategy(incrementingWait(30,TimeUnit.SECONDS,30,TimeUnit.SECONDS)).
//尝试次数
withStopStrategy(StopStrategies.stopAfterAttempt(3)).
//注册监听
withRetryListener(newMyRetryListener()).build();
try{
retryer.call(newTaskCallable());
}catch(Exceptione){
e.printStackTrace();
}
}
}  
其中TaskCallable是任务的具体实现类,它实现了Callable接口
importjava.util.concurrent.Callable; /** *@authorwangxuexing *@descrption *@date */ publicclassTaskCallableimplementsCallable{ publicBooleancall()throwsException{ returnfalse; } } 
另外,MyRetryListener监听实现了RetryListener接口,每次重试都会回调注册的监听
importcom.github.rholder.retry.Attempt;
importcom.github.rholder.retry.RetryListener;
/**
*@authorwangxuexing
*@descrption
*@date
*/
publicclassMyRetryListenerimplementsRetryListener{
publicvoidonRetry(Attemptattempt){
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=30000,hasException=false,hasResult=true,result=false
[retry]time=3,delay=90000,hasException=false,hasResult=true,result=false
com.github.rholder.retry.RetryException:Retryingfailedtocompletesuccessfullyafter3attempts.
atcom.github.rholder.retry.Retryer.call(Retryer.java:174)
attest.retryer.RetryDemo.main(RetryDemo.java:32)
下面详细分析一下:
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指数等待时长策略。
 - FibonacciWaitStrategyFibonacci等待时长策略。
 - ExceptionWaitStrategy异常时长等待策略。
 - CompositeWaitStrategy复合时长等待策略。
 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。