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

Spring中的retry重試組件詳解

 更新時間:2023年10月08日 10:36:33   作者:西魏陶淵明  
這篇文章主要介紹了Spring中的retry重試組件詳解,Retry重試組件是一個處理重試邏輯的工具,可以在出現(xiàn)異?;蚴∏闆r下自動進(jìn)行重試操作,從而提高程序的穩(wěn)定性和可靠性,需要的朋友可以參考下

一、簡介

Spring-retry 前面我們了解到了,Guava的重試組件,我們可以基于Guava的能力,來封裝我們需要的能力來滿足我們的業(yè)務(wù)。

今天來分享Spring-Retry重試組件。當(dāng)然Spring只是幫我們封裝好了,如果你不想自定義 重試組件,那么我們可以直接使用Spring的能力來實(shí)現(xiàn)。

API 也是非常的簡單,幾個注解就可以搞定。

二、依賴

    <!--springboot項(xiàng)目都不用引入版本號-->
    <dependency>
      <groupId>org.springframework.retry</groupId>
      <artifactId>spring-retry</artifactId>
    </dependency>
    <!--還是需要aop的支持的(如果已經(jīng)引入了aop就不用再添加這個依賴了)-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
    </dependency>

三、使用

3.1 @EnableRetry 開啟重試

SpringBoot啟動類上添加開啟重試注解

    @EnableRetry
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
        }
    }

3.2 @Retryable 重試策略

在需要重試的方法上加注解@Retryable

    @Retryable(value = RuntimeException.class, maxAttempts = 5, backoff = @Backoff(delay = 100))
    public String say(String param) {
        double random = Math.random();
        if (random > 0.1) {
            throw new RuntimeException("超時");
        }
        return random + "";
    }
  •  value = RuntimeException.class:是指方法拋出RuntimeException異常時,進(jìn)行重試。這里可以指定你想要攔截的異常。
  •  maxAttempts:是最大重試次數(shù)。如果不寫,則是默認(rèn)3次。
  •  backoff = @Backoff(delay = 100):是指重試間隔。delay=100意味著下一次的重試,要等100毫秒之后才能執(zhí)行。

3.3 @Recover 重試失敗

當(dāng)@Retryable方法重試失敗之后,最后就會調(diào)用@Recover方法。用于@Retryable失敗時的“兜底”處理方法。 @Recover的方法必須要與@Retryable注解的方法保持一致,第一入?yún)橐卦嚨漠惓?,其他參?shù)與@Retryable保持一致,返回值也要一樣,否則無法執(zhí)行!

    @Retryable(value = IllegalAccessException.class)
    public void say() throws IllegalAccessException {
        log.info("do something... {}", LocalDateTime.now());
        throw new IllegalAccessException();
    }
    @Recover
    public void sayBackup(IllegalAccessException e) {
        log.info("service retry after Recover => {}", e.getMessage());
    }

3.4 @CircuitBreaker 熔斷策略

規(guī)定時間內(nèi)如果重試次數(shù)達(dá)到了最大次數(shù),開啟熔斷策略。 5秒內(nèi),這個方法重試了2次,就會斷路。直接走@Recover修飾的方法。當(dāng)超過10s后進(jìn)行重置,繼續(xù)走get方法。

注意@Retryable和@CircuitBreaker不要修飾同一個方法。

    @CircuitBreaker(openTimeout = 5000, maxAttempts = 2,resetTimeout = 10000)
    public String get(@PathVariable Integer flag) {
        if (flag > 1) {
            log.info("重試進(jìn)入");
            throw new RuntimeException("自定義異常");
        }
        return "處理正常";
    }
    @Recover
    public String getBackup(RuntimeException runtimeException) {
        log.error("重試一直失敗,進(jìn)入備用方法:" + runtimeException.getMessage());
        return "備用方法進(jìn)去";
    }
屬性說明
include指定處理的異常類。默認(rèn)為空
exclude指定不需要處理的異常。默認(rèn)為空
value指定要重試的異常。默認(rèn)為空
maxAttempts最大重試次數(shù)。默認(rèn)3次
openTimeout配置熔斷器打開的超時時間,默認(rèn)5s,當(dāng)超過openTimeout之后熔斷器電路變成半打開狀態(tài)(只要有一次重試成功,則閉合電路)
resetTimeout配置熔斷器重新閉合的超時時間,默認(rèn)20s,超過這個時間斷路器關(guān)閉
include指定處理的異常類。默認(rèn)為空

3.5 RetryListener 監(jiān)聽器

spring-retry和guava-retry一樣同樣有監(jiān)聽器。我們可以自定義我們的監(jiān)聽器

@Slf4j
public class DefaultListenerSupport extends RetryListenerSupport {
    @Override
    public <T, E extends Throwable> void close(RetryContext context,
                                               RetryCallback<T, E> callback, Throwable throwable) {
        log.info("onClose");
        super.close(context, callback, throwable);
    }
    @Override
    public <T, E extends Throwable> void onError(RetryContext context,
                                                 RetryCallback<T, E> callback, Throwable throwable) {
        log.info("onError");
        super.onError(context, callback, throwable);
    }
    @Override
    public <T, E extends Throwable> boolean open(RetryContext context,
                                                 RetryCallback<T, E> callback) {
        log.info("onOpen");
        return super.open(context, callback);
    }
}
@Configuration
public class RetryConfig {
    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); //設(shè)置重試策略
        retryPolicy.setMaxAttempts(2);
        retryTemplate.setRetryPolicy(retryPolicy);
        FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); //設(shè)置退避策略
        fixedBackOffPolicy.setBackOffPeriod(2000L);
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        retryTemplate.registerListener(new DefaultListenerSupport()); //設(shè)置retryListener
        return retryTemplate;
    }
}

3.6 RetryPolicy 重試策略

屬性說明
NeverRetryPolicy只允許調(diào)用RetryCallback一次,不允許重試;
AlwaysRetryPolicy允許無限重試,直到成功,此方式邏輯不當(dāng)會導(dǎo)致死循環(huán);
SimpleRetryPolicy固定次數(shù)重試策略,默認(rèn)重試最大次數(shù)為3次,RetryTemplate默認(rèn)使用的策略;
TimeoutRetryPolicy超時時間重試策略,默認(rèn)超時時間為1秒,在指定的超時時間內(nèi)允許重試;
CircuitBreakerRetryPolicy有熔斷功能的重試策略,需設(shè)置3個參數(shù)openTimeout、resetTimeout和delegate
CompositeRetryPolicy組合重試策略,有兩種組合方式,樂觀組合重試策略是指只要有一個策略允許重試即可以,悲觀組合重試策略是指只要有一個策略不允許重試即可以,但不管哪種組合方式,組合中的每一個策略都會執(zhí)行。

3.7 BackOffPolicy 退避策略

下一次重試的策略。 退避是指怎么去做下一次的重試,在這里其實(shí)就是等待多長時間。

屬性說明
FixedBackOffPolicy默認(rèn)固定延遲1秒后執(zhí)行下一次重試
ExponentialBackOffPolicy指數(shù)遞增延遲執(zhí)行重試,默認(rèn)初始0.1秒,系數(shù)是2,那么下次延遲0.2秒,再下次就是延遲0.4秒,如此類推,最大30秒。
ExponentialRandomBackOffPolicy在上面那個策略上增加隨機(jī)性
UniformRandomBackOffPolicy這個跟上面的區(qū)別就是,上面的延遲會不停遞增,這個只會在固定的區(qū)間隨機(jī)
StatelessBackOffPolicy這個說明是無狀態(tài)的,所謂無狀態(tài)就是對上次的退避無感知,從它下面的子類也能看出來

四、總結(jié)

天下代碼一大抄,看你會抄不會抄。發(fā)現(xiàn)無論是guava還是spring的重試,基本都是類似的思路。只是看誰的功能比較鑒權(quán)而已。 guava提供了基礎(chǔ)的能力,你任意封裝。 spring基于spring提供了已經(jīng)完好的能力,直接使用就好。不過因?yàn)槭莝pring給你封裝的能力,所以你要先了解清楚才行。不然可能使用錯誤,造成故障。

以上兩款工具都挺好,不過他們都不支持分布式重試的能力。不過這已經(jīng)滿足我們的日常開發(fā)了,如果真遇到分布式的重試,就自己來實(shí)現(xiàn)咯。

到此這篇關(guān)于Spring中的retry重試組件詳解的文章就介紹到這了,更多相關(guān)retry重試組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot自動配置實(shí)現(xiàn)流程詳細(xì)分析

    SpringBoot自動配置實(shí)現(xiàn)流程詳細(xì)分析

    這篇文章主要介紹了SpringBoot自動配置原理分析,SpringBoot是我們經(jīng)常使用的框架,那么你能不能針對SpringBoot實(shí)現(xiàn)自動配置做一個詳細(xì)的介紹。如果可以的話,能不能畫一下實(shí)現(xiàn)自動配置的流程圖。牽扯到哪些關(guān)鍵類,以及哪些關(guān)鍵點(diǎn)
    2022-12-12
  • java抓取12306信息實(shí)現(xiàn)火車余票查詢示例

    java抓取12306信息實(shí)現(xiàn)火車余票查詢示例

    這篇文章主要介紹了java抓取12306信息實(shí)現(xiàn)火車余票查詢示例,需要的朋友可以參考下
    2014-04-04
  • SpringMVC基于注解的Controller詳解

    SpringMVC基于注解的Controller詳解

    這篇文章主要介紹了SpringMVC基于注解的Controller詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作,結(jié)合實(shí)例形式分析了Spring協(xié)調(diào)作用域不同步的Bean相關(guān)配置及使用技巧,需要的朋友可以參考下
    2019-11-11
  • 解決idea2024版本創(chuàng)建項(xiàng)目時沒有java?8的版本選擇

    解決idea2024版本創(chuàng)建項(xiàng)目時沒有java?8的版本選擇

    這篇文章主要介紹了在使用IntelliJ?IDEA創(chuàng)建Spring?Boot項(xiàng)目時遇到的問題,包括Java版本選擇受限和項(xiàng)目結(jié)構(gòu)不完整,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • java對接阿里通義千問的簡單教程

    java對接阿里通義千問的簡單教程

    有的項(xiàng)目可能需要用到直接外部調(diào)用阿里通義千問的接口,下面這篇文章主要介紹了java對接阿里通義千問的簡單教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java異常體系非正常停止和分類

    Java異常體系非正常停止和分類

    這篇文章主要介紹了Java異常體系非正常停止和分類,指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會導(dǎo)致JVM的非正常停止更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • java轉(zhuǎn)化為exe程序步驟詳解

    java轉(zhuǎn)化為exe程序步驟詳解

    在本篇內(nèi)容里我們給大家分享了關(guān)于java轉(zhuǎn)化為exe程序的具體步驟和相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • Java?Arrays.copyOf?功能示例代碼

    Java?Arrays.copyOf?功能示例代碼

    Arrays.copyOf功能是實(shí)現(xiàn)數(shù)組的復(fù)制,返回復(fù)制后的數(shù)組,這篇文章主要介紹了Java?Arrays.copyOf?功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java生成PDF文檔兩個超實(shí)用的庫( iText和Apache PDFBox)

    Java生成PDF文檔兩個超實(shí)用的庫( iText和Apache PDFBox)

    這篇文章主要介紹了Java生成PDF文檔兩個超實(shí)用的庫,分別是用 iText庫以及用Apache PDFBox庫生成PDF,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02

最新評論

即墨市| 合江县| 巴彦县| 息烽县| 江永县| 宁强县| 天祝| 定日县| 北碚区| 平顶山市| 从化市| 浦东新区| 大名县| 玉田县| 南皮县| 库车县| 东山县| 麦盖提县| 湘潭市| 连城县| 保定市| 若尔盖县| 托克托县| 大同市| 碌曲县| 马龙县| 黑山县| 琼海市| 广西| 镇远县| 石家庄市| 沁阳市| 东至县| 宁晋县| 灵璧县| 金堂县| 奇台县| 沅江市| 息烽县| 鲁甸县| 且末县|