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接口模塊定義清晰,功能職責劃分明確,是很好的設計模式典範,值得深入學習。


分享到:


相關文章: