欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合spring-retry實(shí)現(xiàn)接口請求重試機(jī)制及注意事項(xiàng)

 更新時(shí)間:2021年08月14日 14:18:31   作者:Java潘老師  
今天通過本文給大家介紹我們應(yīng)該如何使用SpringBoot來整合spring-retry組件實(shí)現(xiàn)重試機(jī)制及注意事項(xiàng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧

一、重試機(jī)制

由于網(wǎng)絡(luò)不穩(wěn)定或網(wǎng)絡(luò)抖動經(jīng)常會造成接口請求失敗的情況,當(dāng)我們再去嘗試就成功了,這就是重試機(jī)制。

其主要目的就是要盡可能地提高請求成功的概率,但一般情況下,我們請求第一次失敗,代碼運(yùn)行就拋出異常結(jié)束了,如果想再次請求可能還需要手工操作,這非常地不方便,可行性也不佳。因此,Spring框架提供了對重試機(jī)制支持,并且在Spring Cloud中可以與Hystrix結(jié)合使用,可以避免訪問到已經(jīng)不正常的實(shí)例。

二、重試機(jī)制要素

重試機(jī)制要素如下:

  • 限制重試次數(shù)
  • 每次重試的時(shí)間間隔
  • 最終失敗結(jié)果的報(bào)警或事物回滾
  • 在特定失敗異常事件情況下選擇重試

三、重試機(jī)制注意事項(xiàng)

對于非冪等性的方法我們要慎用重試機(jī)制,可能會造成意料之外的后果。
所謂冪等性:就是用戶對于同一操作發(fā)起的一次請求或者多次請求的結(jié)果是一致的,不會因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用。

四、SpringBoot整合spring-retry

下面我們就來看下,我們應(yīng)該如何使用SpringBoot來整合spring-retry組件實(shí)現(xiàn)重試機(jī)制。

1)添加依賴

首先我們在SpringBoot項(xiàng)目中的pom.xml添加相關(guān)依賴,如下:

<!-- 重試相關(guān)依賴包 -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.4.RELEASE</version>
</dependency>
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>

2)添加@EnableRetry注解

在主啟動類Application上添加@EnableRetry注解,實(shí)現(xiàn)對重試機(jī)制的支持

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

注意:@EnableRetry也可以使用在配置類、ServiceImpl類、方法上

3)添加@Retryable注解

我們針對需要實(shí)現(xiàn)重試的方法上添加@Retryable注解,使該方法可以實(shí)現(xiàn)重試,這里我列出ServiceImpl中的一個(gè)方法:

@Service
public class RetryServiceImpl implements RetryService {
 
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public String testRetry() throws Exception {
 
        System.out.println("開始執(zhí)行代碼:"+ LocalTime.now());
        int code = 0;
        // 模擬一直失敗
        if(code == 0){
           // 這里可以使自定義異常,@Retryable中value需與其一致
            throw new Exception("代碼執(zhí)行異常");
        }
        System.out.println("代碼執(zhí)行成功");
        return "success";
    }
}

說明:@Retryable配置元數(shù)據(jù)情況:
value :針對指定拋出的異常類型,進(jìn)行重試,這里指定的是Exception
maxAttempts :配置最大重試次數(shù),這里配置為3次(包含第一次和最后一次)
delay: 第一次重試延遲間隔,這里配置的是2s
multiplier :每次重試時(shí)間間隔是前一次幾倍,這里是1.5倍

4)Controller測試代碼

@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    private RetryService retryService;
 
    @GetMapping("/retry")
    public String testRetry() throws Exception {
        return retryService.testRetry();
    }
}

5)發(fā)送請求

發(fā)送請求后,我們發(fā)現(xiàn)后臺打印情況,確實(shí)重試了3次,并且在最后一次重試失敗的情況下,才拋出異常,具體如下(可以注意下時(shí)間間隔):

6)補(bǔ)充:@Recover

一般情況下,我們重試最大設(shè)置的次數(shù)后,仍然失敗拋出異常,我們會通過全局異常處理類進(jìn)行統(tǒng)一處理,但是我們其實(shí)也可以自行處理,可以通過@Recover注解來實(shí)現(xiàn),具體如下:

@Service
public class RetryServiceImpl implements RetryService {
 
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public String testRetry() throws Exception {
 
        System.out.println("開始執(zhí)行代碼:"+ LocalTime.now());
        int code = 0;
        if(code == 0){
            // 這里可以使自定義異常,@Retryable中value需與其一致
            throw new Exception("代碼執(zhí)行異常");
        }
        System.out.println("代碼執(zhí)行成功");
        return "success";
    }
 
    /**
     * 最終重試失敗處理
     * @param e
     * @return
     */
    @Recover
    public String recover(Exception e){
 
        System.out.println("代碼執(zhí)行重試后依舊失敗");
        return "fail";
    }
}

注意:
1)@Recover的方法中的參數(shù)異常類型需要與重試方法中一致
2)該方法的返回值類型與重試方法保持一致
再次測試如下(發(fā)現(xiàn)不會再拋出異常):

本文首發(fā)于Java潘老師個(gè)人博客:SpringBoot整合spring-retry組件實(shí)現(xiàn)重試機(jī)制

到此這篇關(guān)于SpringBoot整合spring-retry實(shí)現(xiàn)接口請求重試的注意事項(xiàng)的文章就介紹到這了,更多相關(guān)SpringBoot整合spring-retry重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot如何實(shí)現(xiàn)接口版本控制

    SpringBoot如何實(shí)現(xiàn)接口版本控制

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)接口版本控制,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于@GetMapping注解攜帶參數(shù)的方式

    基于@GetMapping注解攜帶參數(shù)的方式

    這篇文章主要介紹了基于@GetMapping注解攜帶參數(shù)的方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Spring中@Value設(shè)置默認(rèn)值問題解決

    Spring中@Value設(shè)置默認(rèn)值問題解決

    本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot Admin使用及心跳檢測原理分析

    SpringBoot Admin使用及心跳檢測原理分析

    這篇文章主要介紹了SpringBoot Admin使用及心跳檢測原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 一篇文章帶你入門Java Script

    一篇文章帶你入門Java Script

    這篇文章主要介紹了新手入門JavaScript的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-08-08
  • 一篇文章讓你弄懂Java運(yùn)算符

    一篇文章讓你弄懂Java運(yùn)算符

    java中位運(yùn)算符主要有按位與&、按位或|、按位非~、按位異或^, 在使用時(shí)需要將運(yùn)算數(shù)都轉(zhuǎn)換為二進(jìn)制再進(jìn)行運(yùn)算,若為負(fù)數(shù)則使用補(bǔ)碼表示,這篇文章主要給大家介紹了關(guān)于Java運(yùn)算符的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • IDEA 阿里JAVA規(guī)范插件的具體使用

    IDEA 阿里JAVA規(guī)范插件的具體使用

    這篇文章主要介紹了IDEA 阿里JAVA規(guī)范插件的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring實(shí)現(xiàn)動態(tài)修改時(shí)間參數(shù)并手動開啟關(guān)停操作

    Spring實(shí)現(xiàn)動態(tài)修改時(shí)間參數(shù)并手動開啟關(guān)停操作

    spring實(shí)現(xiàn)定時(shí)任務(wù)的方式有三種,分別是java自帶的timer類、spring task和quartz三種。本文只介紹spring自帶的task和第三方quartz,感興趣的朋友參考下吧
    2017-09-09
  • javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    所謂的Java Bean,就是一個(gè)java類,編譯后成為了一個(gè)后綴名是 .class的文件。這就是Java Bean,很多初學(xué)者,包括當(dāng)年的我自己,總是被這些專有名詞搞的暈頭轉(zhuǎn)向
    2021-10-10
  • 關(guān)于SpringMVC請求域?qū)ο蟮臄?shù)據(jù)共享問題

    關(guān)于SpringMVC請求域?qū)ο蟮臄?shù)據(jù)共享問題

    這篇文章主要介紹了SpringMVC請求域?qū)ο蟮臄?shù)據(jù)共享問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02

最新評論