日常開發中經常會遇到接口調用失敗的問題,尤其是兩個系統對接時,當接口調用失敗通常會使用一些方法來進行重試,比如for循環while等,但是這種方式代碼入侵性比較大而且不變維護。
實際上spring已經實現了相關功能,通過@Retryable注解在不入侵原有業務邏輯代碼的方式下,優雅的實現重處理功能。
使用步驟
1、添加依賴
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency>
2、在啟動類或者配置類或者需重試方法所在的類上添加注解@EnableRetry
啟動類示例
@SpringBootApplication @EnableRetry public class DataTransferApplication { public static void main(String[] args) { SpringApplication.run(DataTransferApplication.class, args); } }
配置類示例
@EnableRetry @Configuration public class RetryConfig { }
3、在需要重試的方法上添加@Retryable注解
@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5)) @Override public RetResult manualUploadTemporaryTask(ManualUploadTemporaryTaskReq req) { System.out.println("manualUploadTemporaryTask" + "********"); for (int i = 0 ; i < 5 ; i ++){ int a = 0 / i; } return RetResponse.makeOKRsp(); } @Recover public RetResult temporaryTaskRecover(Exception e,ManualUploadTemporaryTaskReq req){ System.out.println("異常信息是:" + e.getMessage()); System.out.println("=============" + req.toString()); return RetResponse.makeErrRsp("上傳失敗請稍后再試"); }
運行結果
參數說明,Retryable參數列表畢竟多選擇幾個常用的解釋一下,具體可以看官網
interceptor:可以通過該參數,指定方法攔截器的bean名稱
value:拋出指定異常才會重試
include:和value一樣,默認為空,當exclude也為空時,默認所以異常
exclude:指定不處理的異常
maxAttempts:最大重試次數,默認3次
backoff:重試等待策略,默認使用@Backoff,@Backoff的value默認為1000L,我們設置為2000L;multiplier(指定延遲倍數)默認為0,表示固定暫停1秒后進行重試,如果把multiplier設置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。
@Recover說明
當重試耗盡時,用於@Retryable重試失敗后處理方法,此方法里的異常一定要是@Retryable方法里拋出的異常,否則不會調用這個方法。
1、方法的返回值必須與@Retryable方法一致
2、方法的第一個參數,必須是Throwable類型的,建議是與@Retryable配置的異常一致,其他的參數,需要與@Retryable方法的參數一致
3、@Retryable方法和@Recover方法要在同一類中