<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在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,封裝業務程式碼為其回撥函數
構建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利用設定重試策略解決超時問題的文章就介紹到這了,更多相關Java設定重試策略解決超時內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45