




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第Java利用配置重試策略解決超時問題目錄使用場景示例執(zhí)行流程配置注意總結(jié)在web應(yīng)用中,由于網(wǎng)絡(luò)原因或其他不可預(yù)測的原因,應(yīng)用間會出現(xiàn)調(diào)用失敗的情形,通過配置重試策略可以有效解決外在原因?qū)е碌南到y(tǒng)故障。
使用場景
微服務(wù)間各個服務(wù)模塊間的調(diào)用第三方模塊遠程交易調(diào)用非業(yè)務(wù)異常導(dǎo)致可能失敗的情況
示例
構(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()){
//
是否異常導(dǎo)致重試
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í)行重試;當(dāng)?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í)行重試;當(dāng)?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重復(fù)執(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復(fù)合等待策略可配置多個策略進行組合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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度跨境貿(mào)易代理服務(wù)合同范本
- 2025版印刷設(shè)備維修保密協(xié)議
- 二零二五年度新型環(huán)?;疑按u批量采購合同規(guī)范版
- 二零二五年度租賃房屋租賃押金及違約責(zé)任合同
- 2025版化工原材料采購與供應(yīng)鏈管理合同
- 2025版環(huán)保企業(yè)安全生產(chǎn)管理與應(yīng)急處理合同
- 2025版城市更新改造項目施工合同規(guī)范文本
- 二零二五年新型儲能電站維護與保養(yǎng)服務(wù)協(xié)議
- 2025電梯維保安全協(xié)議書-高層住宅電梯全面保障合同
- 2025版鋼結(jié)構(gòu)廠房施工期道路通行與臨時設(shè)施建設(shè)合同
- 2022公務(wù)員錄用體檢操作手冊(試行)
- 新課標的變化與思想政治課的教學(xué)課件
- 動物檢疫檢驗考試題庫(含答案)
- 端子鉚壓標準規(guī)范
- 非法社會組織排查表
- 關(guān)于設(shè)置老年病醫(yī)院(醫(yī)療機構(gòu))的可行性報告
- csc服務(wù)分包考試
- 2023年隆回縣體育教師招聘筆試模擬試題及答案
- GB/T 30146-2013公共安全業(yè)務(wù)連續(xù)性管理體系要求
- GCP培訓(xùn)教學(xué)講解課件
- 手術(shù)室及院感知識培訓(xùn)
評論
0/150
提交評論