一、重試機制
由于網絡不穩定或網絡抖動經常會造成接口請求失敗的情況,當我們再去嘗試就成功了,這就是重試機制。
其主要目的就是要盡可能地提高請求成功的概率,但一般情況下,我們請求第一次失敗,代碼運行就拋出異常結束了,如果想再次請求可能還需要手工操作,這非常地不方便,可行性也不佳。因此,Spring框架提供了對重試機制支持,并且在Spring Cloud中可以與Hystrix結合使用,可以避免訪問到已經不正常的實例。
二、重試機制要素
重試機制要素如下:
- 限制重試次數
- 每次重試的時間間隔
- 最終失敗結果的報警或事物回滾
- 在特定失敗異常事件情況下選擇重試
三、重試機制注意事項
對于非冪等性的方法我們要慎用重試機制,可能會造成意料之外的后果。
所謂冪等性:就是用戶對于同一操作發起的一次請求或者多次請求的結果是一致的,不會因為多次點擊而產生了副作用。
四、SpringBoot整合spring-retry
下面我們就來看下,我們應該如何使用SpringBoot來整合spring-retry組件實現重試機制。
1)添加依賴
首先我們在SpringBoot項目中的pom.xml
添加相關依賴,如下:
<!-- 重試相關依賴包 --> <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注解,實現對重試機制的支持
@SpringBootApplication @EnableRetry public class RetryApplication { public static void main(String[] args) { SpringApplication.run(RetryApplication.class, args); } }
注意:@EnableRetry也可以使用在配置類、ServiceImpl類、方法上
3)添加@Retryable注解
我們針對需要實現重試的方法上添加@Retryable
注解,使該方法可以實現重試,這里我列出ServiceImpl中的一個方法:
@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("開始執行代碼:"+ LocalTime.now()); int code = 0; // 模擬一直失敗 if(code == 0){ // 這里可以使自定義異常,@Retryable中value需與其一致 throw new Exception("代碼執行異常"); } System.out.println("代碼執行成功"); return "success"; } }
說明:@Retryable配置元數據情況:
value :針對指定拋出的異常類型,進行重試,這里指定的是Exception
maxAttempts :配置最大重試次數,這里配置為3次(包含第一次和最后一次)
delay: 第一次重試延遲間隔,這里配置的是2s
multiplier :每次重試時間間隔是前一次幾倍,這里是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)發送請求
發送請求后,我們發現后臺打印情況,確實重試了3次,并且在最后一次重試失敗的情況下,才拋出異常,具體如下(可以注意下時間間隔):
6)補充:@Recover
一般情況下,我們重試最大設置的次數后,仍然失敗拋出異常,我們會通過全局異常處理類進行統一處理,但是我們其實也可以自行處理,可以通過@Recover
注解來實現,具體如下:
@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("開始執行代碼:"+ LocalTime.now()); int code = 0; if(code == 0){ // 這里可以使自定義異常,@Retryable中value需與其一致 throw new Exception("代碼執行異常"); } System.out.println("代碼執行成功"); return "success"; } /** * 最終重試失敗處理 * @param e * @return */ @Recover public String recover(Exception e){ System.out.println("代碼執行重試后依舊失敗"); return "fail"; } }
注意:
1)@Recover的方法中的參數異常類型需要與重試方法中一致
2)該方法的返回值類型與重試方法保持一致
再次測試如下(發現不會再拋出異常):
本文首發于Java潘老師個人博客:SpringBoot整合spring-retry組件實現重試機制
到此這篇關于SpringBoot整合spring-retry實現接口請求重試的注意事項的文章就介紹到這了,更多相關SpringBoot整合spring-retry重試內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/java-ye/p/15140714.html