Guava-retrying优雅实现接口服务的重试机制

<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 返回结果
* @return
*/
public T retryHttpWrapper(Callable callable, List<class>> retryExceptions){
RetryerBuilder builder = RetryerBuilder.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);
}
}

Retryer retryer = builder.build();
try {
return retryer.call(callable);
} catch (ExecutionException | RetryException e) {
throw new RuntimeException(e);
}
}
/<class>
/<code>

由上可见,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优雅实现接口服务的重试机制


总结

guava-retrying通过RetryerBuilder构建重试触发条件,等待重试策略、停止重试策略等配置信息。
Retryer的call方法,通过callable接口封装具体的重试执行逻辑。将重试代码抽象为callable接口,可高效灵活的让用户高度定制化重试逻辑。guava-retrying接口模块定义清晰,功能职责划分明确,是很好的设计模式典范,值得深入学习。


分享到:


相關文章: