<code>原创不易,请多多支持!对软件技术感兴趣的童鞋请关注我,后续技术分享更精彩。/<code>
概述
上篇介绍了 的方法。今天介绍Guava-retrying库一种更通用、更优雅的实现方案。Guava-retrying为Google的一个开源组件库,抽象的更彻底,不仅仅http请求,可针对任何重要资源服务实现重试,如数据库连接,文件资源等。
实现
Guava-retrying库添加:
<code> <dependency>
<groupid>com.github.rholder/<groupid>
<artifactid>guava-retrying/<artifactid>
<version>2.0.0/<version>
/<dependency>/<code>
RetryerGuavaTemplate类实现:
<code>/**
* http请求重试封装类
* @param callable 执行方法
* @param retryExceptions 发生指定异常时重试,可为null
* @param返回结果 /<code>
* @return
*/
publicT retryHttpWrapper(Callable callable, List<class>> retryExceptions){
RetryerBuilderbuilder = RetryerBuilder /<class>.newBuilder()
//发生ConnectException异常时重试
.retryIfExceptionOfType(ConnectException.class)
//重试的等待策略 初始等待1s,每次递增1s。如:第一次1s,第二次2s,第三次3s,以此类推...
.withWaitStrategy(WaitStrategies.incrementingWait(1, TimeUnit.SECONDS,1,TimeUnit.SECONDS))
//重试3次后停止
.withStopStrategy(StopStrategies.stopAfterAttempt(3));
//重试异常添加
if(retryExceptions!=null && retryExceptions.size()>0){
for(Class e:retryExceptions){
builder.retryIfExceptionOfType(e);
}
}
Retryerretryer = builder.build();
try {
return retryer.call(callable);
} catch (ExecutionException | RetryException e) {
throw new RuntimeException(e);
}
}
由上可见,RetryerBuilder构建重试的触发异常条件、重试等待策略和重试停止策略。重试业务逻辑通过实现callable接口自行封装,可支持任何定制需求。
测试代码:
<code>public class RetryerGuavaTemplateTest {
@Test
public void testRetryerHttpWrapper(){
boolean exceptionFlag = true;
RetryerGuavaTemplate retryerGuavaTemplate = new RetryerGuavaTemplate();
retryerGuavaTemplate.retryHttpWrapper(new Callable<boolean>() {
@Override
public Boolean call() throws Exception {
System.out.println(DateUtils.formatDateToDatetimeString(new Date()));
System.out.println("execute the retryer call.");
if(exceptionFlag)
throw new RuntimeException("retryer test...");
return true;
}
}, Lists.newArrayList(RuntimeException.class));
}
}/<boolean>/<code>
测试结果:
测试代码中重试次数为3次,重试等待策略初始等待1s,每增加一次递增1s。通过测试日志打印,与预期吻合。
总结
guava-retrying通过RetryerBuilder构建重试触发条件,等待重试策略、停止重试策略等配置信息。
Retryer的call方法,通过callable接口封装具体的重试执行逻辑。将重试代码抽象为callable接口,可高效灵活的让用户高度定制化重试逻辑。guava-retrying接口模块定义清晰,功能职责划分明确,是很好的设计模式典范,值得深入学习。
閱讀更多 清風明月eagle 的文章