最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用配置重試策略解決超時(shí)問題

 更新時(shí)間:2022年10月14日 11:15:20   作者:指北君  
在web應(yīng)用中,由于網(wǎng)絡(luò)原因或其他不可預(yù)測的原因,應(yīng)用間會出現(xiàn)調(diào)用失敗的情形,通過配置重試策略可以有效解決外在原因?qū)е碌南到y(tǒng)故障。本文就來詳細(xì)說說如何利用配置重試策略解決超時(shí)問題

在web應(yīng)用中,由于網(wǎng)絡(luò)原因或其他不可預(yù)測的原因,應(yīng)用間會出現(xiàn)調(diào)用失敗的情形,通過配置重試策略可以有效解決外在原因?qū)е碌南到y(tǒng)故障。

使用場景

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

示例

構(gòu)建Retryer

private?Retryer?retryer?=?RetryerBuilder.newBuilder()
????????.retryIfException()?//?異常時(shí)重試
????????.retryIfResult(input?->?input!=null?&&?input?instanceof?Boolean?&&?!Boolean.valueOf((Boolean)?input))?//?返回值為false時(shí)重試
????????//?對應(yīng)Future獲取超時(shí)時(shí)間
????????.withAttemptTimeLimiter(AttemptTimeLimiters.fixedTimeLimit(4,?TimeUnit.SECONDS,Executors.newFixedThreadPool(2)))?//重試次數(shù)限制
????????.withRetryListener(new?RetryListener()?{?//?重試執(zhí)行邏輯
????????????@Override
????????????public?<V>?void?onRetry(Attempt<V>?attempt)?{
????????????????log.info("onRetry ->?重試次數(shù):{},距第一次重試時(shí)長:{}",?attempt.getAttemptNumber(),attempt.getDelaySinceFirstAttempt());
????????????????if(attempt.hasException()){?//?是否異常導(dǎo)致重試
????????????????????Throwable?exception?=?attempt.getExceptionCause();?//?執(zhí)行的異常
????????????????????log.info("異常:{}",?exception);
????????????????}
????????????????if(attempt.hasResult()){?//?是否有返回
????????????????????V?result?=?attempt.getResult();
????????????????????log.info("返回:{}",result);
????????????????}
????????????}
????????})
????????//?控制每次重試間隔時(shí)間,如果AttemptTimeLimiter設(shè)置多線程
????????.withWaitStrategy(WaitStrategies.fixedWait(3,TimeUnit.SECONDS))?//?等待策略
????????.withBlockStrategy(BlockStrategies.threadSleepStrategy())?//?阻塞策略
????????//
????????.withStopStrategy(StopStrategies.stopAfterAttempt(5))?//?停止策略
????????.build();

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

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

@Test
public?void?retryWhenResult()?throws?ExecutionException,?RetryException?{
???retryer.call(()?->?{
???????if(counter.incrementAndGet()?==?3){//?模擬前2此返回false,觸發(fā)重試
???????????log.info("?執(zhí)行業(yè)務(wù)代碼:{}次",counter.get());
???????????return?true;
???????}
???????return?false;?
???});
}

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

@Test
public?void?retryWhenException()?throws?ExecutionException,?RetryException?{
????retryer.call(()?->?{
????????if(?counter.getAndIncrement()?==?3?){//?模擬前5此出現(xiàn)異常,觸發(fā)重試
????????????return?counter;
????????}
????????log.info("?執(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次,因此最終失敗
????????????log.info("?執(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ù)時(shí)長;如果失敗,記錄異常、持續(xù)時(shí)長
  • 執(zhí)行監(jiān)聽RetyrListener#onRetry,可以配置多個(gè)監(jiān)聽
  • 執(zhí)行拒絕斷言Predicate,根據(jù)返回值、執(zhí)行異常、返回異常類型判斷是否終止重試
  • 如果滿足條件,則繼續(xù)重試;否則結(jié)束重試,并返回Attempt包含回調(diào)結(jié)果
  • 根據(jù)終止策略StopStrategy判斷是否終止重試
  • 根據(jù)等待策略WaitStrategy獲取等待時(shí)長
  • 根據(jù)阻塞策略BlockStrategy與上一步等待時(shí)長阻塞重試,如果出現(xiàn)異常則拋出RetryException
  • 重復(fù)執(zhí)行以上邏輯

配置

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

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

注意

AttemptTimeLimiter中的FixedAttemptTimeLimit依賴于guava中的SimpleTimeLimiter,但是在guava高版本中該類已經(jīng)成了私有類

總結(jié)

Guava Retrying模塊能夠通過簡單的將代碼實(shí)現(xiàn)業(yè)務(wù)邏輯重試的功能,并且其配置中包含了重試的次數(shù)、時(shí)長控制、重試阻塞、終止策略等等, 在項(xiàng)目中是非常常用的一項(xiàng)技術(shù)。

到此這篇關(guān)于Java利用配置重試策略解決超時(shí)問題的文章就介紹到這了,更多相關(guān)Java配置重試策略解決超時(shí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤

    使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤

    這篇文章主要介紹了使用mybatis-plus報(bào)錯(cuò)Invalid bound statement (not found)錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)

    關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)

    這篇文章主要介紹了關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    Java 利用DeferredResult實(shí)現(xiàn)http輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口

    這篇文章主要介紹了Java 利用 DeferredResult 實(shí)現(xiàn) http 輪詢實(shí)時(shí)返回?cái)?shù)據(jù)接口,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • JAVA對稱加密算法PBE定義與用法實(shí)例分析

    JAVA對稱加密算法PBE定義與用法實(shí)例分析

    這篇文章主要介紹了JAVA對稱加密算法PBE定義與用法,結(jié)合實(shí)例形式分析了JAVA對稱加密算法PBE的概念、原理、定義及使用方法,需要的朋友可以參考下
    2019-09-09
  • java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案

    java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案

    本文主要介紹了java數(shù)據(jù)隨機(jī)分頁實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Spring事務(wù)管理方法步驟解析

    Spring事務(wù)管理方法步驟解析

    這篇文章主要介紹了Spring事務(wù)管理方法步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 基于Spring框架的Shiro配置方法

    基于Spring框架的Shiro配置方法

    這篇文章主要介紹了基于Spring框架的Shiro配置方法,需要的朋友可以參考下
    2014-10-10
  • 分布式消息隊(duì)列RocketMQ概念詳解

    分布式消息隊(duì)列RocketMQ概念詳解

    RocketMQ?是阿里開源的分布式消息中間件,跟其它中間件相比,RocketMQ?的特點(diǎn)是純JAVA實(shí)現(xiàn),是一套提供了消息生產(chǎn),存儲,消費(fèi)全過程API的軟件系統(tǒng),本文詳細(xì)介紹了分布式消息隊(duì)列RocketMQ概念,需要的朋友可以參考下
    2023-05-05
  • SpringBoot整合Spring Security的詳細(xì)教程

    SpringBoot整合Spring Security的詳細(xì)教程

    這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JDK1.8、JDK1.7、JDK1.6區(qū)別看這里

    JDK1.8、JDK1.7、JDK1.6區(qū)別看這里

    這篇文章主要為大家詳細(xì)介紹了JDK1.8、JDK1.7、JDK1.6中的源碼,對比閱讀,發(fā)現(xiàn)修改問題以及改進(jìn)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

宜宾县| 佛山市| 海淀区| 股票| 南江县| 深州市| 辉县市| 商南县| 本溪市| 满城县| 南通市| 山东省| 兴安县| 崇州市| 潮安县| 九龙坡区| 三穗县| 奎屯市| 红桥区| 梓潼县| 台州市| 威宁| 西青区| 广州市| 石狮市| 甘谷县| 托克逊县| 尖扎县| 勐海县| 盱眙县| 中江县| 当涂县| 淮南市| 隆昌县| 襄汾县| 阆中市| 鄂托克旗| 施秉县| 固安县| 南城县| 蒲城县|