




版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨國房地產(chǎn)項目可行性研究報告委托協(xié)議
- 拼多多品牌合作授權(quán)與多平臺運營支持合作協(xié)議
- 緊急狀態(tài)電力備用補充服務(wù)合同
- 綠色環(huán)保建筑模板腳手架租賃協(xié)議
- 生鮮冷鏈倉儲配送及冷鏈物流環(huán)保合同
- 環(huán)保設(shè)施安全運行監(jiān)控補充協(xié)議
- 網(wǎng)紅效應(yīng)面包店區(qū)域代理權(quán)授權(quán)協(xié)議范本
- 知識產(chǎn)權(quán)商標續(xù)展全流程代理合同
- 水利工程臨時監(jiān)理員安全責任承諾合同
- 工程抵押車協(xié)議書
- 組合煙花檢驗原始記錄表
- 【MOOC】模擬電子電路-杭州電子科技大學 中國大學慕課MOOC答案
- 2023年廣東省深圳市南山區(qū)第二外國語學校(集團)學府中學中考歷史二模試卷
- 2018年浙江嘉興舟山中考滿分作文《讓矛盾的心不再矛盾》
- 《高強韌馬氏體不銹鋼組織與性能研究》
- 建筑施工安全設(shè)備檢測實施方案
- 建筑垃圾處置公司激勵與獎勵機制
- GB/T 32151.25-2024溫室氣體排放核算與報告要求第25部分:食品、煙草及酒、飲料和精制茶企業(yè)
- 佳能-M2-Wifi-相機說明書
- JJF 1049-2024溫度傳感器動態(tài)響應(yīng)校準規(guī)范
- 2024年全國物業(yè)客服技能基礎(chǔ)知識考試題庫(附含答案)
評論
0/150
提交評論