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

SpringBoot中使用spring-retry 解決失敗重試調(diào)用

 更新時(shí)間:2023年07月28日 15:41:12   作者:莫輕言舞  
本文主要介紹了SpringBoot中使用spring-retry 解決失敗重試調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在日常開(kāi)發(fā)過(guò)程中,難免會(huì)與第三方接口發(fā)生交互,例如:短信發(fā)送、遠(yuǎn)程服務(wù)調(diào)用、爭(zhēng)搶鎖等場(chǎng)景,當(dāng)正常調(diào)用發(fā)生異常時(shí),例如:網(wǎng)絡(luò)抖動(dòng),這些間歇性的異常在一段時(shí)候之后會(huì)自行恢復(fù),程序?yàn)榱烁咏巡⑶腋蝗菀壮霈F(xiàn)故障,需要重新觸發(fā)業(yè)務(wù)操作,以防止間歇性的異常對(duì)程序照成的影響。

常用的重試策略,比如通過(guò) while 循環(huán)手動(dòng)重復(fù)調(diào)用或是通過(guò) JDK/CGLib 動(dòng)態(tài)代理的方式來(lái)進(jìn)行重試。但是這種方法比較笨重,且對(duì)原有邏輯代碼的入侵性比較大。

1、引入spring-retry

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

這里我們還引入了 aop 的依賴,因?yàn)?spring-retry 的原理就是基于 aop 來(lái)實(shí)現(xiàn)的

2、開(kāi)啟spring-retry

啟動(dòng)類上增加注解 @EnableRetry

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

3、@Retryable

在需要重試的方法上增加注解 @Retryable,表示該方法需要重試

@Component
public class TestRetry {
    int a = 0;
    @Retryable(value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未滿足條件");
        }
        return "執(zhí)行成功";
    }
}

@Retryable 注解

  • value,可重試的異常類型。含義同include。默認(rèn)為空(如果excludes也為空,則重試所有異常)
  • include:可重試的異常類型。默認(rèn)為空(如果excludes也為空,則重試所有異常)
  • exclude:無(wú)需重試的異常類型。默認(rèn)為空(如果includes也為空,則重試所有異常)
  • maxAttempts:最大重試次數(shù)(包括第一次失敗),默認(rèn)為3次
  • backoff:重試等待策略,下面會(huì)在@Backoff中介紹
  • recover:表示重試次數(shù)到達(dá)最大重試次數(shù)后的回調(diào)方法

@Backoff 注解

  • delay,重試之間的等待時(shí)間(以毫秒為單位)
  • maxDelay,重試之間的最大等待時(shí)間(以毫秒為單位)
  • multiplier,指定延遲的倍數(shù)
  • delayExpression,重試之間的等待時(shí)間表達(dá)式
  • maxDelayExpression,重試之間的最大等待時(shí)間表達(dá)式
  • multiplierExpression,指定延遲的倍數(shù)表達(dá)式
  • random,隨機(jī)指定延遲時(shí)間

4、重試耗盡

當(dāng)重試耗盡時(shí),RetryOperations 可以將控制傳遞給另一個(gè)回調(diào),即 RecoveryCallback。Spring-Retry 還提供了 @Recover 注解,用于 @Retryable 重試失敗后處理方法。若不需要重試失敗后的處理方法,則不寫回調(diào)方法,重試耗盡后拋出異常。

@Recover
public String recoverTest(RuntimeException e) {
    return "回調(diào)方法-" + e.getMessage();
}
  • 方法的返回值必須與 @Retryable 方法一致
  • 方法的第一個(gè)參數(shù),必須是 Throwable 類型的,建議是與 @Retryable 配置的異常一致,其他的參數(shù),需要哪個(gè)參數(shù),寫進(jìn)去就可以了(@Recover 方法中有的)
  • 該回調(diào)方法與重試方法寫在同一個(gè)實(shí)現(xiàn)類里面

若同一個(gè)實(shí)現(xiàn)類中有多個(gè)回調(diào)方法,我們需要使用 recover 屬性指定回調(diào)的方法名

@Component
public class TestRetry {
    int a = 0;
    @Retryable(recover = "recoverTest1", value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未滿足條件");
        }
        return "執(zhí)行成功";
    }
    @Recover
    public String recoverTest(RuntimeException e) {
        return "回調(diào)方法-" + e.getMessage();
    }
    @Recover
    public String recoverTest1(RuntimeException e) {
        return "回調(diào)方法1-" + e.getMessage();
    }
}

指定了回調(diào)方法為 recoverTest1

5、注意事項(xiàng)

由于是基于 AOP 實(shí)現(xiàn),所以不支持類里自調(diào)用方法

如果重試失敗需要給 @Recover 注解的方法做后續(xù)處理,那這個(gè)重試的方法不能有返回值,只能是 void

方法內(nèi)不能使用 try catch,只能往外拋異常

@Recover 注解來(lái)開(kāi)啟重試失敗后調(diào)用的方法(注意,需跟重處理方法在同一個(gè)類中),此注解注釋的方法參數(shù)一定要是 @Retryable 拋出的異常,否則無(wú)法識(shí)別,可以在該方法中進(jìn)行日志處理。

到此這篇關(guān)于SpringBoot中使用spring-retry 解決失敗重試調(diào)用的文章就介紹到這了,更多相關(guān)SpringBoot spring-retry失敗重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼

    Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼
    2016-11-11
  • Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例

    Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例

    在實(shí)際項(xiàng)目中,某些場(chǎng)景下可能需要使用到分布式鎖功能,那么實(shí)現(xiàn)分布式鎖有多種方式,常見(jiàn)的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下
    2023-06-06
  • Spring Boot實(shí)現(xiàn)分布式鎖的自動(dòng)釋放的示例代碼

    Spring Boot實(shí)現(xiàn)分布式鎖的自動(dòng)釋放的示例代碼

    在實(shí)際開(kāi)發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統(tǒng)來(lái)實(shí)現(xiàn)分布式鎖,本文將介紹如何使用 Spring Boot 來(lái)實(shí)現(xiàn)分布式鎖的自動(dòng)釋放,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法

    Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法,在計(jì)算機(jī)編程中,輸出學(xué)號(hào)和姓名是一個(gè)常見(jiàn)的任務(wù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)鏈表的常見(jiàn)操作算法詳解

    Java實(shí)現(xiàn)鏈表的常見(jiàn)操作算法詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)鏈表的常見(jiàn)操作算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java?Http請(qǐng)求方式之RestTemplate常用方法詳解

    Java?Http請(qǐng)求方式之RestTemplate常用方法詳解

    這篇文章主要為大家介紹了Java?Http請(qǐng)求方式之RestTemplate常用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解

    SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解

    這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解,在Springboot中定時(shí)任務(wù)是一項(xiàng)經(jīng)常能用到的功能,實(shí)現(xiàn)定時(shí)任務(wù)的方式有很多,今天來(lái)介紹常用的幾種,需要的朋友可以參考下
    2023-11-11
  • springboot 使用上下文獲取bean

    springboot 使用上下文獲取bean

    這篇文章主要介紹了springboot 使用上下文獲取bean,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Java 獲取本機(jī)IP地址的方法的兩種方法

    Java 獲取本機(jī)IP地址的方法的兩種方法

    本文主要介紹了Java 獲取本機(jī)IP地址的方法的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • SpringBoot啟動(dòng)過(guò)程與自動(dòng)配置過(guò)程解讀

    SpringBoot啟動(dòng)過(guò)程與自動(dòng)配置過(guò)程解讀

    本文詳解SpringBoot啟動(dòng)流程及自動(dòng)配置機(jī)制,涵蓋main方法初始化、環(huán)境配置、容器啟動(dòng)等關(guān)鍵步驟,解析條件注解與spring.factories的智能配置邏輯,并提供自定義配置方法,強(qiáng)調(diào)其"約定優(yōu)于配置"的核心理念與工程化封裝特性
    2025-08-08

最新評(píng)論

榕江县| 密山市| 六盘水市| 富阳市| 张家界市| 喜德县| 自治县| 龙门县| 德钦县| 鹤峰县| 嘉祥县| 襄樊市| 新乐市| 丹凤县| 九江市| 阿克苏市| 玉龙| 团风县| 龙江县| 什邡市| 巴林右旗| 富川| 新乐市| 鲁山县| 庆城县| 常州市| 达州市| 故城县| 江西省| 阳西县| 玛多县| 延边| 苍梧县| 柳林县| 德清县| 汕头市| 盐津县| 保山市| 西安市| 元氏县| 建宁县|