SpringBoot整合spring-retry實(shí)現(xiàn)接口請求重試機(jī)制及注意事項(xiàng)
一、重試機(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)接口版本控制,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Spring中@Value設(shè)置默認(rèn)值問題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring實(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-09javaSE基礎(chǔ)如何通俗的理解javaBean是什么
所謂的Java Bean,就是一個(gè)java類,編譯后成為了一個(gè)后綴名是 .class的文件。這就是Java Bean,很多初學(xué)者,包括當(dāng)年的我自己,總是被這些專有名詞搞的暈頭轉(zhuǎn)向2021-10-10關(guān)于SpringMVC請求域?qū)ο蟮臄?shù)據(jù)共享問題
這篇文章主要介紹了SpringMVC請求域?qū)ο蟮臄?shù)據(jù)共享問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02