input!= null input instanceof Boolean ! Boolean .valueOf(( Boolean ) input)) // 返回值為false時重試 // 對應Future獲取超時時間" />

色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Guava Retrying模塊使用場景

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-08 09:55 ? 次閱讀

在web應用中,由于網絡原因或其他不可預測的原因,應用間會出現調用失敗的情形,通過配置重試策略可以有效解決外在原因導致的系統故障。

使用場景

  1. 微服務間各個服務模塊間的調用
  2. 第三方模塊遠程交易調用
  3. 非業務異常導致可能失敗的情況

示例

構建Retryer

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

使用Retryer讓業務代碼擁有重試能力

前兩次執行時模擬返回false,則會執行重試;當第3次時,正常執行業務代碼并返回true,結束重試

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

模擬前3次出現異常,則會執行重試;當第3次時,正常執行業務代碼,結束重試

@Test
public void retryWhenException() throws ExecutionException, RetryException {
    retryer.call(() - > {
        if( counter.getAndIncrement() == 3 ){// 模擬前5此出現異常,觸發重試
            return counter;
        }
        log.info(" 執行業務代碼: {}次", counter.get());
         throw new RuntimeException("ERROR"); 
    });
}

模擬前5此出現異常,由于Retryer配置重試次數為5,則最終業務代碼不會執行

@Test
public void retryWhenResultOnFailure() throws ExecutionException, RetryException {
    retryer.call(() - > {
        if(counter.incrementAndGet() == 8){// 模擬前7此返回false,由于配置重試5次,因此最終失敗
            log.info(" 執行業務代碼:{}次",counter.get());
            return true;
        }
        return false;
    });
}

執行流程

圖片

執行流程

通過RetryerBuilder構建Retryer,調用Retryer#call,封裝業務代碼為其回調函數

  1. 開始循環執行
  2. 由AttemptTimeLimiter#call執行回調函數
  3. 將結果封裝為Attempt,包括兩種類型ResultAttempt,ExceptionAttempt。如果成功,記錄執行結果、持續時長;如果失敗,記錄異常、持續時長
  4. 執行監聽RetyrListener#onRetry,可以配置多個監聽
  5. 執行拒絕斷言Predicate,根據返回值、執行異常、返回異常類型判斷是否終止重試
  6. 如果滿足條件,則繼續重試;否則結束重試,并返回Attempt包含回調結果
  7. 根據終止策略StopStrategy判斷是否終止重試
  8. 根據等待策略WaitStrategy獲取等待時長
  9. 根據阻塞策略BlockStrategy與上一步等待時長阻塞重試,如果出現異常則拋出RetryException
  10. 重復執行以上邏輯

配置

構建Retryer主要通過RetryerBuilder.newBuilder()實現,其相關配置如下:

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

注意

  1. AttemptTimeLimiter中的FixedAttemptTimeLimit依賴于guava中的SimpleTimeLimiter,但是在guava高版本中該類已經成了私有類

總結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2696

    瀏覽量

    47434
  • 函數
    +關注

    關注

    3

    文章

    4329

    瀏覽量

    62575
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68535
收藏 人收藏

    評論

    相關推薦

    模塊化儀器的技術原理和應用場景

    模塊化儀器是插拔式的計算機板卡,功能類似于傳統的臺式儀器,其技術原理和應用場景可以歸納如下:一、技術原理 模塊化設計:模塊化儀器使用一個框架,可以將不同類型或不同數量的功能卡插入其中,
    發表于 11-28 15:09

    =>的使用場景有哪些

    使用場景
    發表于 10-27 13:25

    ARM的技術特征是什么?應用場景有哪些?

    ARM的技術特征是什么?應用場景有哪些?
    發表于 11-05 07:32

    藍牙模塊的5大應用場景

    打印機打印出符合要求的二維碼以二維碼的形式將藍牙MAC地址打印出來,方便藍牙產品對藍牙MAC地址進行讀取,能夠有效提高工作效率。五、智能門鎖在智能門鎖的應用場景中,利用藍牙技術可以滿足不同用戶和權限
    發表于 12-09 09:37

    MS9331的應用場景是什么?

    MS9331的應用場景是什么?
    發表于 02-11 06:41

    labview 和 wincc 的區別 使用場景

    labview 和 wincc 的區別 使用場景 都是上位機軟件,都可以做監控軟件 wincc的名氣也比較大 對比的資料較少 寫這些文章的人,從自己的從事的行業出發,帶有自己的思維 使用的場景 肯定
    發表于 10-27 18:01

    一文深度了解串口WiFi模塊作用,串口WiFi模塊的應用場景

    串口WiFi模塊作用,串口WiFi模塊的應用場景
    發表于 03-01 14:25 ?28次下載

    無線模塊的十大應用場景

    無線模塊的十大應用場景
    發表于 05-08 10:17 ?18次下載

    網絡音頻模塊有哪些應用場景

    對音頻信號進行編解碼、處理和轉換,支持多種音頻格式和協議,例如MP3、AAC、G.711等。網絡音頻模塊可以實現單向或雙向的語音通信,也可以實現多路的語音廣播。 網絡音頻模塊有哪些應用場景? 網絡音頻
    的頭像 發表于 05-16 10:24 ?687次閱讀
    網絡音頻<b class='flag-5'>模塊</b>有哪些應<b class='flag-5'>用場景</b>?

    LoRa模塊的應用場景

    LoRa遠程無線傳輸技術擁有傳輸距離遠、功耗低、性能高、無線組網,遠程定位等一系列特點,使用終端與LoRa基站組件低功耗數據傳輸網絡成為了物聯網大規模推廣應用的理想選擇之一。那么LoRa模塊可以使用在哪些應用場景呢?思為無線就來為您解答。
    的頭像 發表于 04-18 15:10 ?889次閱讀
    LoRa<b class='flag-5'>模塊</b>的應<b class='flag-5'>用場景</b>

    DC電源模塊不同的尺寸可以適應實際應用場景

    DC電源模塊是現代電子設備的必備部件之一,其可提供穩定的直流電源,保證電子設備正常運行。DC電源模塊尺寸的選擇直接影響到其適應的應用場景及其性能表現。本文將從尺寸方面分析DC電源模塊
    的頭像 發表于 08-29 10:32 ?559次閱讀

    Guava Collect常見的集合類

    Guava工具包中的一個子模塊,主要對jdk中的集合操作添加了一些簡易的API,同時也是對Collections工具類的擴展。當然Guava還定義了一些特定場景的數據結構以及一些針對
    的頭像 發表于 10-08 11:35 ?458次閱讀

    千兆光模塊和萬兆光模塊的適用場景有哪些

    隨著網絡技術的不斷進步,千兆光模塊和萬兆光模塊成為使用最為廣泛的兩款光模塊。本文將介紹一些光模塊使用場景,以便用戶更加深入的了解這兩款光
    的頭像 發表于 10-16 12:06 ?905次閱讀

    DC電源模塊和AC電源模塊都有各自的優點和適用場景

    BOSHIDA DC電源模塊和AC電源模塊都有各自的優點和適用場景 DC電源模塊和AC電源模塊都有各自的優點和適
    的頭像 發表于 12-29 14:39 ?956次閱讀
    DC電源<b class='flag-5'>模塊</b>和AC電源<b class='flag-5'>模塊</b>都有各自的優點和適<b class='flag-5'>用場景</b>

    800G光模塊的應用場景

    隨著科技發展,數據中心對光模塊需求大增。800G光模塊作為一種高速光傳輸技術,應用場景擴展并引起廣泛關注。主要應用于數據中心、云計算和網絡通信等領域,滿足現代社會對高帶寬、快速數據傳輸的需求。
    的頭像 發表于 03-11 15:30 ?672次閱讀
    主站蜘蛛池模板: 丰满少妇发泄14p| 日日夜夜噜噜| 暗卫受被肉到失禁各种PLAY| 亚洲精品国产乱码AV在线观看| 久久久久久久免费| 国产精品99久久久精品无码 | 亚洲免费三区| 日韩在线看片中文字幕不卡| 免费成年人在线视频| 黄色小说在线| 国产高清免费观看| good神马电影伦理午夜| 在线天天看片免费视频观看| 亚洲1卡二卡3卡4卡新区在线| 日本欧美午夜三级| 欧美GAY猛男GAYA片18禁| 久久国产精品二区99| 国产私拍福利精品视频| 国产成人精品免费视频大| 办公室激情在线观看| 99久久国产露脸精品竹菊传煤| 伊人久久青草| 野草观看免费高清视频| 亚洲国产综合久久久无码色伦| 忘忧草研究院一二三| 色视频色露露永久免费观看| 全黄h全肉短篇禁乱np| 欧美人与动牲交A免费| 美女张开腿让男生桶动态图| 巨乳中文无码亚洲| 久草网国产自偷拍| 久草高清在线| 精子射到丝袜上图| 精品蜜臀AV在线天堂| 果冻传媒视频在线播放| 国内精品一级毛片免费看| 国产亚洲精品久久孕妇呦呦你懂| 国产精品美女久久久久浪潮AV| 国产精品久久久久久亚洲影视| 国产精品毛片在线视频| 国产毛片A级久久久不卡精品|