色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java基于Guava Retrying實(shí)現(xiàn)重試功能

瀏覽:2日期:2022-08-29 16:49:36

在接口調(diào)用中由于各種原因,可能會(huì)重置失敗的任務(wù),使用Guava-Retrying可以方便的實(shí)現(xiàn)重試功能。

首先,需要引用Guava-Retrying的包

<dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version></dependency>

代碼示例:

import com.github.rholder.retry.Retryer;import com.github.rholder.retry.RetryerBuilder;import com.github.rholder.retry.StopStrategies;import com.google.common.base.Predicates;import java.util.concurrent.TimeUnit;import static com.github.rholder.retry.WaitStrategies.incrementingWait;/** * @author wangxuexing * @descrption * @date */public class RetryDemo { public static void main(String[] args) { Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder(). //如果異常會(huì)重試 retryIfException(). //如果結(jié)果為false會(huì)重試 retryIfResult(Predicates.equalTo(false)). //重調(diào)策略 withWaitStrategy(incrementingWait(30, TimeUnit.SECONDS, 30, TimeUnit.SECONDS)). //嘗試次數(shù) withStopStrategy(StopStrategies.stopAfterAttempt(3)). //注冊(cè)監(jiān)聽(tīng) withRetryListener(new MyRetryListener()).build(); try { retryer.call(new TaskCallable()); } catch (Exception e) { e.printStackTrace(); } }}

其中TaskCallable是任務(wù)的具體實(shí)現(xiàn)類(lèi),它實(shí)現(xiàn)了Callable接口

import java.util.concurrent.Callable;/** * @author wangxuexing * @descrption * @date */public class TaskCallable implements Callable<Boolean> { public Boolean call() throws Exception { return false; }}

另外,MyRetryListener監(jiān)聽(tīng)實(shí)現(xiàn)了RetryListener接口,每次重試都會(huì)回調(diào)注冊(cè)的監(jiān)聽(tīng)

import com.github.rholder.retry.Attempt;import com.github.rholder.retry.RetryListener;/** * @author wangxuexing * @descrption * @date */public class MyRetryListener implements RetryListener { public <V> void onRetry(Attempt<V> attempt) { System.out.print('[retry]time=' + attempt.getAttemptNumber()); // 距離第一次重試的延遲 System.out.print(',delay=' + attempt.getDelaySinceFirstAttempt()); // 重試結(jié)果: 是異常終止, 還是正常返回 System.out.print(',hasException=' + attempt.hasException()); System.out.print(',hasResult=' + attempt.hasResult()); // 是什么原因?qū)е庐惓? if (attempt.hasException()) { System.out.print(',causeBy=' + attempt.getExceptionCause().toString()); } else {// 正常返回時(shí)的結(jié)果 System.out.print(',result=' + attempt.getResult()); } System.out.println(); }}

執(zhí)行一下main方法,可以看到執(zhí)行的結(jié)果:

[retry]time=1,delay=0,hasException=false,hasResult=true,result=false[retry]time=2,delay=30000,hasException=false,hasResult=true,result=false[retry]time=3,delay=90000,hasException=false,hasResult=true,result=falsecom.github.rholder.retry.RetryException: Retrying failed to complete successfully after 3 attempts.at com.github.rholder.retry.Retryer.call(Retryer.java:174)at test.retryer.RetryDemo.main(RetryDemo.java:32)

下面詳細(xì)分析一下:

RetryerBuilder是一個(gè)factory創(chuàng)建者,可以定制設(shè)置重試源且可以支持多個(gè)重試源,可以配置重試次數(shù)或重試超時(shí)時(shí)間,以及可以配置等待時(shí)間間隔,創(chuàng)建重試者Retryer實(shí)例。

RetryerBuilder的重試源支持Exception異常對(duì)象 和自定義斷言對(duì)象,通過(guò)retryIfException 和retryIfResult設(shè)置,同時(shí)支持多個(gè)且能兼容。 retryIfException,拋出runtime異常、checked異常時(shí)都會(huì)重試,但是拋出error不會(huì)重試。 retryIfRuntimeException只會(huì)在拋runtime異常的時(shí)候才重試,checked異常和error都不重試。 retryIfExceptionOfType允許我們只在發(fā)生特定異常的時(shí)候才重試,比如NullPointerException和IllegalStateException都屬于runtime異常,也包括自定義的error retryIfResult可以指定你的Callable方法在返回值的時(shí)候進(jìn)行重試

StopStrategy:停止重試策略,提供三種:

StopAfterDelayStrategy 設(shè)定一個(gè)最長(zhǎng)允許的執(zhí)行時(shí)間;比如設(shè)定最長(zhǎng)執(zhí)行10s,無(wú)論任務(wù)執(zhí)行次數(shù),只要重試的時(shí)候超出了最長(zhǎng)時(shí)間,則任務(wù)終止,并返回重試異常RetryException。

NeverStopStrategy 不停止,用于需要一直輪訓(xùn)知道返回期望結(jié)果的情況。

StopAfterAttemptStrategy 設(shè)定最大重試次數(shù),如果超出最大重試次數(shù)則停止重試,并返回重試異常。

WaitStrategy:等待時(shí)長(zhǎng)策略(控制時(shí)間間隔),返回結(jié)果為下次執(zhí)行時(shí)長(zhǎng): FixedWaitStrategy 固定等待時(shí)長(zhǎng)策略。 RandomWaitStrategy 隨機(jī)等待時(shí)長(zhǎng)策略(可以提供一個(gè)最小和最大時(shí)長(zhǎng),等待時(shí)長(zhǎng)為其區(qū)間隨機(jī)值)。 IncrementingWaitStrategy 遞增等待時(shí)長(zhǎng)策略(提供一個(gè)初始值和步長(zhǎng),等待時(shí)間隨重試次數(shù)增加而增加)。 ExponentialWaitStrategy 指數(shù)等待時(shí)長(zhǎng)策略。 FibonacciWaitStrategy Fibonacci 等待時(shí)長(zhǎng)策略。 ExceptionWaitStrategy 異常時(shí)長(zhǎng)等待策略。 CompositeWaitStrategy 復(fù)合時(shí)長(zhǎng)等待策略。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 91精品国产综合久久久久久 | 波多野一区二区三区在线 | 玖草在线视频 | 久9青青cao精品视频在线 | 一区二区三区在线播放 | www.日本三级 | 日韩精品无码一区二区三区 | 亚洲一级毛片在线观播放 | 欧美特黄一级视频 | 中文字幕一区二区在线播放 | 久久国产精品-国产精品 | 72种姿势欧美久久久久大黄蕉 | 男人女人做刺激视频免费 | 免费手机黄色网址 | 欧美视频一区在线观看 | 亚洲午夜久久久久国产 | 国内自拍网站 | 中文字幕人成乱码在线观看 | 国产精品亚洲二线在线播放 | 中国老太性色xxxxxhd | 亚洲国产成人久久99精品 | 亚洲精品国产高清不卡在线 | 99久久国产综合精品网成人影院 | 欧美在线观看不卡 | 自拍偷拍视频在线观看 | 成人免费观看视频久爱网 | 亚洲 欧美 中文字幕 | 欧美成人精品一级高清片 | 狠狠做久久深爱婷婷97动漫 | 国产成人精品男人的天堂网站 | 久久国产国内精品对话对白 | 国产大片在线看 | 最新国产区 | 成人中文字幕在线 | 97久久精品视频 | 免费人成激情视频在线观看冫 | 制服丝袜在线视频香蕉 | 手机看片日韩日韩国产在线看 | 香港av三级 | 亚洲欧美在线精品一区二区 | 亚洲精品中文一区不卡 |