使用Spring-Retry解決Spring Boot應用程序中的重試問題
1、背景
在日常開發(fā)過程中,難免會與第三方接口發(fā)生交互,例如:遠程服務調用當正常調用發(fā)生異常時,例如:網絡抖動等短時間內的臨時問題,程序為了更加健壯并且更不容易出現(xiàn)故障。需要重新觸發(fā)業(yè)務操作,以防止間歇性的異常對程序照成的影響。這個可以就可以用重試來解決。
2、引入依賴
<!--因為spring-retry是基于aop實現(xiàn),所以需要引入aop--> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
3、開啟spring-retry
在springboot的啟動類上增加注解 @EnableRetry
@EnableRetry @SpringBootApplication public class RetryApplication { public static void main(String[] args) { SpringApplication.run(RetryApplication.class, args); } }
4、在方法上添加@Retryable
@Component public class TestRetry { /** * value:拋出指定異常才會重試 * include:和value一樣,默認為空,當exclude也為空時,默認所有異常 * exclude:指定不處理的異常 * maxAttempts:最大重試次數,默認3次 * backoff:重試等待策略, * 默認使用@Backoff,@Backoff的value默認為1000L,我們設置為2000; 以毫秒為單位的延遲(默認 1000) * multiplier(指定延遲倍數)默認為0,表示固定暫停1秒后進行重試,如果把multiplier設置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。 * @param code * @return * @throws Exception */ @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5)) public int testRetry(int code) throws Exception{ System.out.println("test被調用,時間:"+ LocalTime.now()); if (code==0){ throw new Exception("調用失敗!"); } System.out.println("test被調用!"); return 200; } }
@Retryable 注解
value,可重試的異常類型。含義同include。默認為空(如果excludes也為空,則重試所有異常)
include:可重試的異常類型。默認為空(如果excludes也為空,則重試所有異常)
exclude:無需重試的異常類型。默認為空(如果includes也為空,則重試所有異常)
maxAttempts:最大重試次數(包括第一次失敗),默認為3次
backoff:重試等待策略,下面會在@Backoff中介紹
recover:表示重試次數到達最大重試次數后的回調方法
@Backoff 注解
delay,重試之間的等待時間(以毫秒為單位)
maxDelay,重試之間的最大等待時間(以毫秒為單位)
multiplier,指定延遲的倍數
delayExpression,重試之間的等待時間表達式
maxDelayExpression,重試之間的最大等待時間表達式
multiplierExpression,指定延遲的倍數表達式
random,隨機指定延遲時間
5、重試完
當重試完,RetryOperations 可以將控制傳遞給另一個回調,即 RecoveryCallback。Spring-Retry 還提供了 @Recover 注解,用于 @Retryable 重試失敗后處理方法。若不需要重試失敗后的處理方法,則不寫回調方法,重試耗盡后拋出異常。
@Component public class TestRetry { @Retryable(recover = "recoverTest",value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5)) public int testRetry(int code) throws Exception{ System.out.println("test被調用,時間:"+ LocalTime.now()); if (code==0){ throw new Exception("調用失??!"); } System.out.println("test被調用!"); return 200; } /** **方法的返回值必須與 @Retryable 方法一致 **方法的第一個參數,必須是 Throwable 類型的,建議是與 @Retryable 配置的**異常一致,其他的參數,需要哪個參數,寫進去就可以了(@Recover 方法中有的) **該回調方法與重試方法寫在同一個實現(xiàn)類里面 */ @Recover public String recoverTest(RuntimeException e) { return "回調方法-" + e.getMessage(); } }
6、注意事項
由于是基于 AOP 實現(xiàn),所以不支持類里自調用方法
如果重試失敗需要給 @Recover 注解的方法做后續(xù)處理,那這個重試的方法不能有返回值,只能是 void
方法內不能使用 try catch,只能往外拋異常
@Recover 注解來開啟重試失敗后調用的方法(注意,需跟重處理方法在同一個類中),此注解注釋的方法參數一定要是 @Retryable 拋出的異常,否則無法識別,可以在該方法中進行日志處理。
到此這篇關于使用Spring-Retry解決Spring Boot應用程序中的重試問題的文章就介紹到這了,更多相關Spring-Retry解決重試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot讀取properties或者application.yml配置文件中的數據
這篇文章主要介紹了SpringBoot讀取properties或者application.yml配置文件中的數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06springboot2中使用@JsonFormat注解不生效的解決
這篇文章主要介紹了springboot2中使用@JsonFormat注解不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot http請求注解@RestController原理解析
這篇文章主要介紹了SpringBoot http請求注解@RestController原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01Java Runtime類詳解_動力節(jié)點Java學院整理
Runtime類封裝了運行時的環(huán)境。每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環(huán)境相連接。下面通過本文給大家分享Java Runtime類詳解,需要的朋友參考下吧2017-04-04