Java利用配置重試策略解決超時問題_第1頁
Java利用配置重試策略解決超時問題_第2頁
Java利用配置重試策略解決超時問題_第3頁
Java利用配置重試策略解決超時問題_第4頁
Java利用配置重試策略解決超時問題_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java利用配置重試策略解決超時問題目錄使用場景示例執(zhí)行流程配置注意總結(jié)在web應(yīng)用中,由于網(wǎng)絡(luò)原因或其他不可預測的原因,應(yīng)用間會出現(xiàn)調(diào)用失敗的情形,通過配置重試策略可以有效解決外在原因?qū)е碌南到y(tǒng)故障。

使用場景

微服務(wù)間各個服務(wù)模塊間的調(diào)用第三方模塊遠程交易調(diào)用非業(yè)務(wù)異常導致可能失敗的情況

示例

構(gòu)建Retryer

private

Retryer

retryer

=

RetryerBuilder.newBuilder()

.retryIfException()

//

異常時重試

.retryIfResult(input

-

input!=null

input

instanceof

Boolean

!Boolean.valueOf((Boolean)

input))

//

返回值為false時重試

//

對應(yīng)Future獲取超時時間

.withAttemptTimeLimiter(AttemptTimeLimiters.fixedTimeLimit(4,

TimeUnit.SECONDS,Executors.newFixedThreadPool(2)))

//重試次數(shù)限制

.withRetryListener(new

RetryListener()

{

//

重試執(zhí)行邏輯

@Override

public

V

void

onRetry(AttemptV

attempt)

{

("onRetry-

重試次數(shù):{},距第一次重試時長:{}",

attempt.getAttemptNumber(),attempt.getDelaySinceFirstAttempt());

if(attempt.hasException()){

//

是否異常導致重試

Throwable

exception

=

attempt.getExceptionCause();

//

執(zhí)行的異常

("異常:{}",

exception);

}

if(attempt.hasResult()){

//

是否有返回

V

result

=

attempt.getResult();

("返回:{}",result);

}

}

})

//

控制每次重試間隔時間,如果AttemptTimeLimiter設(shè)置多線程

.withWaitStrategy(WaitStrategies.fixedWait(3,TimeUnit.SECONDS))

//

等待策略

.withBlockStrategy(BlockStrategies.threadSleepStrategy())

//

阻塞策略

//

.withStopStrategy(StopStrategies.stopAfterAttempt(5))

//

停止策略

.build();

使用Retryer讓業(yè)務(wù)代碼擁有重試能力

前兩次執(zhí)行時模擬返回false,則會執(zhí)行重試;當?shù)?次時,正常執(zhí)行業(yè)務(wù)代碼并返回true,結(jié)束重試

@Test

public

void

retryWhenResult()

throws

ExecutionException,

RetryException

{

retryer.call(()

-

{

if(counter.incrementAndGet()

==

3){//

模擬前2此返回false,觸發(fā)重試

("

執(zhí)行業(yè)務(wù)代碼:{}次",counter.get());

return

true;

}

return

false;

});

模擬前3次出現(xiàn)異常,則會執(zhí)行重試;當?shù)?次時,正常執(zhí)行業(yè)務(wù)代碼,結(jié)束重試

@Test

public

void

retryWhenException()

throws

ExecutionException,

RetryException

{

retryer.call(()

-

{

if(

counter.getAndIncrement()

==

3

){//

模擬前5此出現(xiàn)異常,觸發(fā)重試

return

counter;

}

("

執(zhí)行業(yè)務(wù)代碼:

{}次",

counter.get());

throw

new

RuntimeException("ERROR");

});

模擬前5此出現(xiàn)異常,由于Retryer配置重試次數(shù)為5,則最終業(yè)務(wù)代碼不會執(zhí)行

@Test

public

void

retryWhenResultOnFailure()

throws

ExecutionException,

RetryException

{

retryer.call(()

-

{

if(counter.incrementAndGet()

==

8){//

模擬前7此返回false,由于配置重試5次,因此最終失敗

("

執(zhí)行業(yè)務(wù)代碼:{}次",counter.get());

return

true;

}

return

false;

});

執(zhí)行流程

執(zhí)行流程

通過RetryerBuilder構(gòu)建Retryer,調(diào)用Retryer#call,封裝業(yè)務(wù)代碼為其回調(diào)函數(shù)

開始循環(huán)執(zhí)行由AttemptTimeLimiter#call執(zhí)行回調(diào)函數(shù)將結(jié)果封裝為Attempt,包括兩種類型ResultAttempt,ExceptionAttempt。如果成功,記錄執(zhí)行結(jié)果、持續(xù)時長;如果失敗,記錄異常、持續(xù)時長執(zhí)行監(jiān)聽RetyrListener#onRetry,可以配置多個監(jiān)聽執(zhí)行拒絕斷言Predicate,根據(jù)返回值、執(zhí)行異常、返回異常類型判斷是否終止重試如果滿足條件,則繼續(xù)重試;否則結(jié)束重試,并返回Attempt包含回調(diào)結(jié)果根據(jù)終止策略StopStrategy判斷是否終止重試根據(jù)等待策略WaitStrategy獲取等待時長根據(jù)阻塞策略BlockStrategy與上一步等待時長阻塞重試,如果出現(xiàn)異常則拋出RetryException重復執(zhí)行以上邏輯

配置

構(gòu)建Retryer主要通過RetryerBuilder.newBuilder()實現(xiàn),其相關(guān)配置如下:

配置策略名稱描述AttemptTimeLimiters任務(wù)執(zhí)行時長限制NoAttemptTimeLimit無時長限制FixedAttemptTimeLimit固定時長限制WaitStrategies重試等待策略ExponentialWaitStrategy指數(shù)等待策略按指數(shù)增加重試間隔時長,比如第一次2^1100、2^2100、2^3*100...最多300000FibonacciWaitStrategy斐波那契等待策略1100、1100、2100、3100、5*100...FixedWaitStrategy固定時長等待策略按配置的固定間隔時間RandomWaitStrategy隨機時長等待策略隨機間隔時間,可以設(shè)置隨機值范圍IncrementingWaitStrategy遞增等待策略根據(jù)配置的初始值與增量進行累加時間ExceptionWaitStrategy異常等待策略根據(jù)異常類型指定等待時間CompositeWaitStrategy復合等待策略可配置多個策略進行組合BlockStrategies阻塞策略根據(jù)WaitStrategies獲取阻塞時長ThreadSleepStrategy線程等等策略通過Thread.sleet()實現(xiàn)StopStrategies重試停止策略NeverStopStrategy無限制策略StopAfterAttemptStrategy限定次數(shù)策略StopAfterDelayStrategy限定時長策略NoAttemptTimeLimit限定次數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論