最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年07月06日 09:39:27   作者:BarryW  
這篇文章主要介紹了Java基于Guava Retrying實現(xiàn)重試功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

在接口調(diào)用中由于各種原因,可能會重置失敗的任務(wù),使用Guava-Retrying可以方便的實現(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().
                  //如果異常會重試
                  retryIfException().
                  //如果結(jié)果為false會重試
                  retryIfResult(Predicates.equalTo(false)).
                  //重調(diào)策略
                  withWaitStrategy(incrementingWait(30, TimeUnit.SECONDS, 30, TimeUnit.SECONDS)).
                  //嘗試次數(shù)
                  withStopStrategy(StopStrategies.stopAfterAttempt(3)).
                  //注冊監(jiān)聽
                  withRetryListener(new MyRetryListener()).build();
    try {
      retryer.call(new TaskCallable());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

其中TaskCallable是任務(wù)的具體實現(xiàn)類,它實現(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)聽實現(xiàn)了RetryListener接口,每次重試都會回調(diào)注冊的監(jiān)聽

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 {// 正常返回時的結(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=false
com.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是一個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
  • retryIfResult可以指定你的Callable方法在返回值的時候進行重試

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ù)合時長等待策略。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)短信驗證碼的示例代碼

    Java實現(xiàn)短信驗證碼的示例代碼

    Java是一種流行的編程語言,驗證碼是一種常用的網(wǎng)絡(luò)安全技術(shù)。Java發(fā)展至今,網(wǎng)上也出現(xiàn)了各種各樣的驗證碼,下面是用Java實現(xiàn)短信驗證碼的總結(jié),感興趣的可以了解一下
    2023-03-03
  • Activiti開發(fā)環(huán)境的搭建過程詳解

    Activiti開發(fā)環(huán)境的搭建過程詳解

    這篇文章主要介紹了Activiti開發(fā)環(huán)境的搭建過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringCache常用注解及key中參數(shù)值為null問題解析

    SpringCache常用注解及key中參數(shù)值為null問題解析

    這篇文章主要介紹了SpringCache常用注解及key中參數(shù)值為null的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 詳解Mybatis中的PooledDataSource

    詳解Mybatis中的PooledDataSource

    這篇文章主要介紹了詳解Mybatis中的PooledDataSource,PooledDataSource使用了數(shù)據(jù)庫連接池可以實現(xiàn)數(shù)據(jù)庫連接池的重復(fù)利用,還能控制連接數(shù)據(jù)庫的連接上限
    2022-06-06
  • Spring MVC處理響應(yīng)的案例詳解

    Spring MVC處理響應(yīng)的案例詳解

    當(dāng)服務(wù)器向客戶端響應(yīng)數(shù)據(jù)時,SpringMVC框架會使用“轉(zhuǎn)換器”(Converter)將方法的返回值進行轉(zhuǎn)換,SpringMVC框架還會自動使用不同的轉(zhuǎn)換器,因此這篇文章就給大家詳細(xì)介紹一下Spring MVC如何處理響應(yīng)并附上案例,需要的朋友可以參考下
    2023-06-06
  • Java switch case數(shù)據(jù)類型原理解析

    Java switch case數(shù)據(jù)類型原理解析

    這篇文章主要介紹了Java switch case數(shù)據(jù)類型原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot3安全管理操作方法

    SpringBoot3安全管理操作方法

    這篇文章主要介紹了SpringBoot3安全管理,在實際開發(fā)中,最常用的是登錄驗證和權(quán)限體系兩大功能,在登錄時完成身份的驗證,加載相關(guān)信息和角色權(quán)限,在訪問其他系統(tǒng)資源時,進行權(quán)限的驗證,保護系統(tǒng)的安全,文中有詳細(xì)的操作步驟,需要的朋友可以參考下
    2023-08-08
  • MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    MyBatis?多表聯(lián)合查詢及優(yōu)化方法

    大家都知道Hibernate 是全自動的數(shù)據(jù)庫持久層框架,它可以通過實體來映射數(shù)據(jù)庫,通過設(shè)置一對多、多對一、一對一、多對多的關(guān)聯(lián)來實現(xiàn)聯(lián)合查詢,接下來通過本文給大家介紹MyBatis?多表聯(lián)合查詢及優(yōu)化,需要的朋友可以參考下
    2022-08-08
  • springboot2中session超時,退到登錄頁面方式

    springboot2中session超時,退到登錄頁面方式

    這篇文章主要介紹了springboot2中session超時,退到登錄頁面方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java MD5消息摘要算法原理及實現(xiàn)代碼

    Java MD5消息摘要算法原理及實現(xiàn)代碼

    這篇文章主要介紹了Java MD5消息摘要算法原理及實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論

上虞市| 石家庄市| 武邑县| 孝昌县| 昆明市| 新津县| 玉门市| 东光县| 镇安县| 冕宁县| 微山县| 台江县| 宜宾市| 成都市| 通化市| 舟曲县| 山西省| 建湖县| 天全县| 洪江市| 屏边| 东安县| 页游| 萍乡市| 平阳县| 竹溪县| 大港区| 仙居县| 南溪县| 昌平区| 茂名市| 临夏县| 藁城市| 高邑县| 西乌珠穆沁旗| 迁安市| 宁城县| 韶山市| 双牌县| 平果县| 台东市|