成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網絡又超時了......怎么辦?

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

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

使用場景

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

示例

構建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,封裝業務代碼為其回調函數。

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

配置

構建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

限定次數


注意

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

總結

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


責任編輯:武曉燕 來源: Java技術指北
相關推薦

2009-11-03 08:56:02

linux死機操作系統

2022-12-19 11:31:57

緩存失效數據庫

2022-07-05 11:48:47

MySQL死鎖表鎖

2023-12-07 08:46:41

Kafka服務問題網絡問題

2017-08-30 17:21:05

LinuxShell超時現象

2021-10-30 19:01:17

磁盤字節文件

2022-07-05 14:19:30

Spring接口CGLIB

2011-11-16 10:02:48

DNSDNS記錄DNS記錄消失

2011-11-18 10:52:00

2018-01-28 20:39:39

戴爾

2023-12-25 08:22:02

2018-01-30 15:08:05

2021-12-09 11:46:53

DockerIPLinux

2020-07-10 08:46:26

HTTPS證書劫持網絡協議

2021-01-05 10:48:38

RedisAOF日志RDB快照

2024-08-06 08:08:14

2020-02-24 11:02:37

斷網網絡故障

2013-02-18 09:19:11

谷歌X PhoneNexus

2024-07-29 08:01:32

2024-08-06 12:29:23

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级在线 | 中文字幕欧美日韩 | 久久伊| 91精品国产91久久久久久三级 | 波霸ol一区二区 | 精品国产一区久久 | 欧美一级黄色免费 | 国产一区二区在线免费观看 | 黄网站免费在线观看 | 综合久久99| 黄色福利 | 亚洲精品www久久久 www.蜜桃av | 亚洲一区二区三区视频 | 国产精品美女久久久久久免费 | 91麻豆精品国产91久久久久久久久 | 欧美精品综合在线 | 亚洲精品一级 | 另类在线 | 国产精品中文字幕一区二区三区 | 免费激情网站 | 天堂三级 | 午夜一级做a爰片久久毛片 精品综合 | 中文字幕日韩欧美 | 自拍偷拍3p | 日韩美女在线看免费观看 | 国产在线视频一区二区董小宛性色 | 久草视频观看 | 黄视频网址 | 九色在线观看 | 少妇黄色| 国产一区二区三区视频在线观看 | 久久精品国产99国产 | 色婷婷综合在线观看 | 成人免费精品 | 日韩成人久久 | 91精品综合久久久久久五月天 | 99精品国自产在线观看 | 久久成人免费视频 | 黄色a级一级片 | 国产激情91久久精品导航 | 日韩精品在线一区 |