溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Guava-Retryer

發(fā)布時間:2021-10-19 17:45:47 來源:億速云 閱讀:125 作者:柒染 欄目:大數(shù)據(jù)

什么是Guava-Retryer,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在日常開發(fā)中,我們經(jīng)常會遇到需要調(diào)用外部服務(wù)和接口的場景。外部服務(wù)對于調(diào)用者來說一般都是不可靠的,尤其是在網(wǎng)絡(luò)環(huán)境比較差的情況下,網(wǎng)絡(luò)抖動很容易導(dǎo)致請求超時等異常情況,這時候就需要使用失敗重試策略重新調(diào)用 API 接口來獲取。重試策略在服務(wù)治理方面也有很廣泛的使用,通過定時檢測,來查看服務(wù)是否存活(Active)。

Guava Retrying是一個靈活方便的重試組件,包含了多種的重試策略,而且擴展起來非常容易。

用作者的話來說:

This is a small extension to Google’s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.

使用Guava-retrying你可以自定義來執(zhí)行重試,同時也可以監(jiān)控每次重試的結(jié)果和行為,最重要的基于 Guava 風(fēng)格的重試方式真的很方便。

代碼示例

  • 引入Guava-retry

<guava-retry.version>2.0.0</guava-retry.version>
<dependency>
      <groupId>com.github.rholder</groupId>
      <artifactId>guava-retrying</artifactId>
      <version>${guava-retry.version}</version>
</dependency>
  • 定義實現(xiàn)Callable接口的方法,以便Guava retryer能夠調(diào)用

package org.java.base.retry;

import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.WaitStrategies;
import com.google.common.base.Predicates;

public class RetryTest {
 private static final Logger logger = LoggerFactory.getLogger(RetryTest.class);
 public static void main(String[] args){ 
 Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
 .retryIfResult(Predicates.<Boolean>isNull())// 設(shè)置自定義段元重試源
 .retryIfExceptionOfType(Exception.class)// 設(shè)置異常重試源
 .retryIfRuntimeException()// 設(shè)置異常重試源
 .withStopStrategy(StopStrategies.stopAfterAttempt(5))// 設(shè)置重試5次,同樣可以設(shè)置重試超時時間
 .withWaitStrategy(WaitStrategies.fixedWait(5L, TimeUnit.SECONDS))// 設(shè)置每次重試間隔,5秒
 .build();
 try {
 retryer.call(new Callable<Boolean>() {
 int i = 0;

 @Override
 public Boolean call() throws Exception {
 i++;
 logger.info("第{}次執(zhí)行!", i);
 // do something
 if (i<6) {// 模擬錯2次
 logger.info("模擬執(zhí)行失??!");
 throw new IOException("異常");
 }
 logger.info("模擬執(zhí)行成功!");
 return true; 
 }
 });
 } catch (RetryException e) {
 logger.info("超過重試次數(shù)", e);
 } catch (ExecutionException e) {
 logger.info("重試框架異常", e);
 }
 }


}

簡單三步就能使用Guava Retryer優(yōu)雅的實現(xiàn)重調(diào)方法。
接下來對其進行詳細說明:

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

  • RetryerBuilder的重試源支持Exception異常對象 和自定義斷言對象,通過retryIfException 和retryIfResult設(shè)置,同時支持多個且能兼容。

  • retryIfException,拋出runtime異常、checked異常時都會重試,但是拋出error不會重試。

  • retryIfRuntimeException只會在拋runtime異常的時候才重試,checked異常和error都不重試。

  • retryIfExceptionOfType允許我們只在發(fā)生特定異常的時候才重試,比如NullPointerException和IllegalStateException`都屬于runtime異常,也包括自定義的error

如:

.retryIfExceptionOfType(Error.class)// 只在拋出error重試

當(dāng)然我們還可以在只有出現(xiàn)指定的異常的時候才重試,如:

.retryIfExceptionOfType(IllegalStateException.class)  
.retryIfExceptionOfType(NullPointerException.class)

或者通過Predicate實現(xiàn)

.retryIfException(Predicates.or(Predicates.instanceOf(NullPointerException.class),  
                Predicates.instanceOf(IllegalStateException.class)))

retryIfResult可以指定你的Callable方法在返回值的時候進行重試,如

// 返回false重試 
.retryIfResult(Predicates.equalTo(false))  
//以_error結(jié)尾才重試 
.retryIfResult(Predicates.containsPattern("_error$"))

運行結(jié)果如下:

什么是Guava-Retryer

主要接口及策略介紹:

Attempt:一次執(zhí)行任務(wù);

AttemptTimeLimiter:單次任務(wù)執(zhí)行時間限制(如果單次任務(wù)執(zhí)行超時,則終止執(zhí)行當(dāng)前任務(wù));

BlockStrategies:任務(wù)阻塞策略(通俗的講就是當(dāng)前任務(wù)執(zhí)行完,下次任務(wù)還沒開始這段時間做什么……),默認策略為:BlockStrategies.THREAD_SLEEP_STRATEGY 也就是調(diào)用 Thread.sleep(sleepTime);

RetryException:重試異常;

RetryListener:自定義重試監(jiān)聽器,可以用于異步記錄錯誤日志;

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

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

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

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

WaitStrategy:等待時長策略(控制時間間隔),返回結(jié)果為下次執(zhí)行時長:

  • FixedWaitStrategy:固定等待時長策略;

  • RandomWaitStrategy:隨機等待時長策略(可以提供一個最小和最大時長,等待時長為其區(qū)間隨機值)

  • IncrementingWaitStrategy:遞增等待時長策略(提供一個初始值和步長,等待時間隨重試次數(shù)增加而增加)

  • ExponentialWaitStrategy:指數(shù)等待時長策略;

  • FibonacciWaitStrategy :Fibonacci 等待時長策略;

  • ExceptionWaitStrategy :異常時長等待策略;

  • CompositeWaitStrategy :復(fù)合時長等待策略;

關(guān)于什么是Guava-Retryer問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)
推薦閱讀:
  1. 什么是PHP
  2. 什么是python

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI