亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Spring-Retry解決Spring Boot應(yīng)用程序中的重試問題

 更新時間:2023年04月18日 11:20:32   作者:陽關(guān)的美好  
重試的使用場景比較多,比如調(diào)用遠(yuǎn)程服務(wù)時,由于網(wǎng)絡(luò)或者服務(wù)端響應(yīng)慢導(dǎo)致調(diào)用超時,此時可以多重試幾次。用定時任務(wù)也可以實(shí)現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個注解搞定所有,感興趣的可以了解一下

1、背景

在日常開發(fā)過程中,難免會與第三方接口發(fā)生交互,例如:遠(yuǎn)程服務(wù)調(diào)用當(dāng)正常調(diào)用發(fā)生異常時,例如:網(wǎng)絡(luò)抖動等短時間內(nèi)的臨時問題,程序?yàn)榱烁咏巡⑶腋蝗菀壮霈F(xiàn)故障。需要重新觸發(fā)業(yè)務(wù)操作,以防止間歇性的異常對程序照成的影響。這個可以就可以用重試來解決。

2、引入依賴

<!--因?yàn)閟pring-retry是基于aop實(shí)現(xiàn),所以需要引入aop-->
<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

3、開啟spring-retry

在springboot的啟動類上增加注解 @EnableRetry

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

4、在方法上添加@Retryable

@Component
public class TestRetry {
       /**
     * value:拋出指定異常才會重試
     * include:和value一樣,默認(rèn)為空,當(dāng)exclude也為空時,默認(rèn)所有異常
     * exclude:指定不處理的異常
     * maxAttempts:最大重試次數(shù),默認(rèn)3次
     * backoff:重試等待策略,
     * 默認(rèn)使用@Backoff,@Backoff的value默認(rèn)為1000L,我們設(shè)置為2000; 以毫秒為單位的延遲(默認(rèn) 1000)
     * multiplier(指定延遲倍數(shù))默認(rèn)為0,表示固定暫停1秒后進(jìn)行重試,如果把multiplier設(shè)置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。
     * @param code
     * @return
     * @throws Exception
     */
    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public int testRetry(int code) throws Exception{
        System.out.println("test被調(diào)用,時間:"+ LocalTime.now());
          if (code==0){
              throw new Exception("調(diào)用失敗!");
          }
        System.out.println("test被調(diào)用!");
        return 200;
    }
}

@Retryable 注解

value,可重試的異常類型。含義同include。默認(rèn)為空(如果excludes也為空,則重試所有異常)

include:可重試的異常類型。默認(rèn)為空(如果excludes也為空,則重試所有異常)

exclude:無需重試的異常類型。默認(rèn)為空(如果includes也為空,則重試所有異常)

maxAttempts:最大重試次數(shù)(包括第一次失敗),默認(rèn)為3次

backoff:重試等待策略,下面會在@Backoff中介紹

recover:表示重試次數(shù)到達(dá)最大重試次數(shù)后的回調(diào)方法

@Backoff 注解

delay,重試之間的等待時間(以毫秒為單位)

maxDelay,重試之間的最大等待時間(以毫秒為單位)

multiplier,指定延遲的倍數(shù)

delayExpression,重試之間的等待時間表達(dá)式

maxDelayExpression,重試之間的最大等待時間表達(dá)式

multiplierExpression,指定延遲的倍數(shù)表達(dá)式

random,隨機(jī)指定延遲時間

5、重試完

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

@Component
public class TestRetry {
    @Retryable(recover = "recoverTest",value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public int testRetry(int code) throws Exception{
        System.out.println("test被調(diào)用,時間:"+ LocalTime.now());
          if (code==0){
              throw new Exception("調(diào)用失??!");
          }
        System.out.println("test被調(diào)用!");
        return 200;
    }
/**
**方法的返回值必須與 @Retryable 方法一致
**方法的第一個參數(shù),必須是 Throwable 類型的,建議是與 @Retryable 配置的**異常一致,其他的參數(shù),需要哪個參數(shù),寫進(jìn)去就可以了(@Recover 方法中有的)
**該回調(diào)方法與重試方法寫在同一個實(shí)現(xiàn)類里面
*/
 @Recover
    public String recoverTest(RuntimeException e) {
        return "回調(diào)方法-" + e.getMessage();
    }
}

6、注意事項(xiàng)

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

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

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

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

到此這篇關(guān)于使用Spring-Retry解決Spring Boot應(yīng)用程序中的重試問題的文章就介紹到這了,更多相關(guān)Spring-Retry解決重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù)

    SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù)

    這篇文章主要介紹了SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java定義形式及可變參數(shù)實(shí)例解析

    Java定義形式及可變參數(shù)實(shí)例解析

    這篇文章主要介紹了Java定義形式及可變參數(shù)實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Spring中@Transactional注解的使用詳解

    Spring中@Transactional注解的使用詳解

    @Transactional注解是Spring提供的一種聲明式事務(wù)管理方式,這篇文章主要為大家詳細(xì)介紹了@Transactional注解的原理分析及使用,需要的可以參考一下
    2023-05-05
  • springboot2中使用@JsonFormat注解不生效的解決

    springboot2中使用@JsonFormat注解不生效的解決

    這篇文章主要介紹了springboot2中使用@JsonFormat注解不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼

    這篇文章主要介紹了java加密算法--MD5加密和哈希散列帶秘鑰加密算法源碼的相關(guān)資料,這里附實(shí)例代碼,幫助到大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-11-11
  • Netty分布式高性能工具類異線程下回收對象解析

    Netty分布式高性能工具類異線程下回收對象解析

    這篇文章主要介紹了Netty分布式高性能工具類異線程下回收對象解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java使用GZIP壓縮導(dǎo)致HTTP請求返回亂碼問題解決

    Java使用GZIP壓縮導(dǎo)致HTTP請求返回亂碼問題解決

    這篇文章主要為大家介紹了Java壓縮GZIP導(dǎo)致HTTP請求返回亂碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • SpringBoot http請求注解@RestController原理解析

    SpringBoot http請求注解@RestController原理解析

    這篇文章主要介紹了SpringBoot http請求注解@RestController原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring注解之@Value詳解

    Spring注解之@Value詳解

    這篇文章主要介紹了Spring注解之@Value詳解,@Value可以修飾屬性、方法、參數(shù)、注釋類型,編譯器會將?@Value注解的信息保留在?.class?文件中,并且能被虛擬機(jī)讀取,需要的朋友可以參考下
    2024-01-01
  • Java Runtime類詳解_動力節(jié)點(diǎn)Java學(xué)院整理

    Java Runtime類詳解_動力節(jié)點(diǎn)Java學(xué)院整理

    Runtime類封裝了運(yùn)行時的環(huán)境。每個 Java 應(yīng)用程序都有一個 Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。下面通過本文給大家分享Java Runtime類詳解,需要的朋友參考下吧
    2017-04-04

最新評論