SpringBoot整合spring-retry實(shí)現(xiàn)接口請(qǐng)求重試機(jī)制及注意事項(xiàng)
一、重試機(jī)制
由于網(wǎng)絡(luò)不穩(wěn)定或網(wǎng)絡(luò)抖動(dòng)經(jīng)常會(huì)造成接口請(qǐng)求失敗的情況,當(dāng)我們?cè)偃L試就成功了,這就是重試機(jī)制。
其主要目的就是要盡可能地提高請(qǐng)求成功的概率,但一般情況下,我們請(qǐng)求第一次失敗,代碼運(yùn)行就拋出異常結(jié)束了,如果想再次請(qǐng)求可能還需要手工操作,這非常地不方便,可行性也不佳。因此,Spring框架提供了對(duì)重試機(jī)制支持,并且在Spring Cloud中可以與Hystrix結(jié)合使用,可以避免訪問到已經(jīng)不正常的實(shí)例。
二、重試機(jī)制要素
重試機(jī)制要素如下:
- 限制重試次數(shù)
- 每次重試的時(shí)間間隔
- 最終失敗結(jié)果的報(bào)警或事物回滾
- 在特定失敗異常事件情況下選擇重試
三、重試機(jī)制注意事項(xiàng)
對(duì)于非冪等性的方法我們要慎用重試機(jī)制,可能會(huì)造成意料之外的后果。
所謂冪等性:就是用戶對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用。
四、SpringBoot整合spring-retry
下面我們就來看下,我們應(yīng)該如何使用SpringBoot來整合spring-retry組件實(shí)現(xiàn)重試機(jī)制。
1)添加依賴
首先我們?cè)赟pringBoot項(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注解
在主啟動(dòng)類Application上添加@EnableRetry注解,實(shí)現(xiàn)對(duì)重試機(jī)制的支持
@SpringBootApplication
@EnableRetry
public class RetryApplication {
public static void main(String[] args) {
SpringApplication.run(RetryApplication.class, args);
}
}
注意:@EnableRetry也可以使用在配置類、ServiceImpl類、方法上
3)添加@Retryable注解
我們針對(duì)需要實(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 :針對(duì)指定拋出的異常類型,進(jìn)行重試,這里指定的是Exception
maxAttempts :配置最大重試次數(shù),這里配置為3次(包含第一次和最后一次)
delay: 第一次重試延遲間隔,這里配置的是2s
multiplier :每次重試時(shí)間間隔是前一次幾倍,這里是1.5倍
4)Controller測(cè)試代碼
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RetryService retryService;
@GetMapping("/retry")
public String testRetry() throws Exception {
return retryService.testRetry();
}
}
5)發(fā)送請(qǐng)求
發(fā)送請(qǐng)求后,我們發(fā)現(xiàn)后臺(tái)打印情況,確實(shí)重試了3次,并且在最后一次重試失敗的情況下,才拋出異常,具體如下(可以注意下時(shí)間間隔):
6)補(bǔ)充:@Recover
一般情況下,我們重試最大設(shè)置的次數(shù)后,仍然失敗拋出異常,我們會(huì)通過全局異常處理類進(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)該方法的返回值類型與重試方法保持一致
再次測(cè)試如下(發(fā)現(xiàn)不會(huì)再拋出異常):
本文首發(fā)于Java潘老師個(gè)人博客:SpringBoot整合spring-retry組件實(shí)現(xiàn)重試機(jī)制
到此這篇關(guān)于SpringBoot整合spring-retry實(shí)現(xiàn)接口請(qǐng)求重試的注意事項(xiàng)的文章就介紹到這了,更多相關(guān)SpringBoot整合spring-retry重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
修改xml文件再也不用重啟項(xiàng)目mybatis-xmlreload方法
這篇文章主要為大家介紹了修改xml文件再也不用重啟項(xiàng)目mybatis-xmlreload,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Struts2中ognl遍歷數(shù)組,list和map方法詳解
這篇文章主要介紹了Struts2中ognl遍歷數(shù)組,list和map方法詳解,需要的朋友可以參考下。2017-09-09
Spring Boot 整合 Mockito提升Java單元測(cè)試的高效實(shí)踐案例
Mockito與Spring Boot的整合為Java開發(fā)者提供了一套完整的解決方案,使得單元測(cè)試更為精準(zhǔn)、高效,從而確保了代碼質(zhì)量、降低了維護(hù)成本,并促進(jìn)了項(xiàng)目的持續(xù)集成與交付,感興趣的朋友跟隨小編一起看看吧2024-04-04
使用resty Quartz執(zhí)行定時(shí)任務(wù)的配置方法
這篇文章主要為大家介紹了使用resty?Quartz來執(zhí)行定時(shí)任務(wù)的配置方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Java中ArrayList與LinkedList的使用及區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java中ArrayList與LinkedList的使用及區(qū)別的相關(guān)資料,ArrayList和LinkedList都是實(shí)現(xiàn)了List接口的容器類,用于存儲(chǔ)一系列的對(duì)象引用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
使用Jitpack發(fā)布開源Java庫(kù)的詳細(xì)流程
這篇文章主要介紹了使用Jitpack發(fā)布開源Java庫(kù)的詳細(xì)流程,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
使用Java獲取html中Select,radio多選的值方法
以下是對(duì)使用Java獲取html中Select,radio多選值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08



