SpringBoot使用spring retry重試機制的操作詳解
重試在功能設計上需要根據(jù)應用場景進行設計,讀數(shù)據(jù)的接口比較適合重試的場景,寫數(shù)據(jù)的接口就需要注意接口的冪等性了,還有就是重試次數(shù)如果太多的話會導致請求量加倍,給后端造成更大的壓力,設置合理的重試機制是關鍵;
Spring Retry重試框架
Spring boot使用spring retry重試機制
1.pom引用
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
2.應用啟動類開啟retry
@EnableRetry public class Application { ....... }
3.在指定方法上標記@Retryable來開啟重試
@Retryable(value={RuntimeException.class},maxAttempts=5,backoff = @Backoff(delay = 2000,multiplier = 1.5)) public void retryTest() throws Exception { System.out.println(Thread.currentThread().getName()+" do something..."); throw new RuntimeException(); }
value: 指定發(fā)生的異常進行重試
include: 和value一樣,默認空,當exclude也為空時,所有異常都重試
exclude: 指定異常不重試,默認空,當include也為空時,所有異常都重試
maxAttemps: 重試次數(shù),默認3
backoff: 重試補償機制,默認沒有
4.在指定方法上標記@Recover來開啟重試失敗后調用的方法(注意,需跟重處理方法在同一個類中)
@Recover public void recover(RuntimeException e) { // ... do something }
使用詳解
spring-retry通過AOP實現(xiàn)對目的方法的封裝,執(zhí)行在當前線程下,所以重試過程中當前線程會堵塞。如果BackOff時間設置比較長,最好起異步線程重試(也可以加@Async注解)。
@Retryable注解
被注解的方法發(fā)生異常時會重試
value:指定發(fā)生的異常進行重試
include:和value一樣,默認空,當exclude也為空時,所有異常都重試
exclude:指定異常不重試,默認空,當include也為空時,所有異常都重試
maxAttemps:重試次數(shù),默認3
backoff:重試補償機制,默認沒有
@Backoff注解
delay:指定延遲后重試
multiplier:指定延遲的倍數(shù),比如delay=5000l,multiplier=2時,第一次重試為5秒后,第二次為10秒,第三次為20秒
@Recover
當重試到達指定次數(shù)時,被注解的方法將被回調,可以在該方法中進行日志處理。需要注意的是發(fā)生的異常和入?yún)㈩愋鸵恢聲r才會回調
spring-retry踩坑
一、@Retryable未生效可能原因
@Retryable方法必須為 public
下面情況下@Retryable不生效,即重試方法與調用它的非重試方法在同一個類中。
// 注意 此方法不生效?。?! @EnableRetry(proxyTargetClass = true) class test{ public void methodA(){ methodB(); } @Retryable public void methodB(){ } }
解決方案:將重試方法單獨寫了一個Service。
3.每個類中對一種異常只有一個重試方法。兩個重試方法捕捉Exception,重試失效。
二、@Recover未生效可能原因
①返回值必須和被重試的函數(shù)返回值一致;
②參數(shù)中除了第一個是觸發(fā)的異常外,后面的參數(shù)需要和被重試函數(shù)的參數(shù)列表一致;
③當然這里的返回值部分也可以再做一次手動重試,但是已經(jīng)嘗試那么多次都失敗了,所以在兜底函數(shù)中再做一次也意義不大。因此我的考慮是,這里就用來做日志記錄就好。
以上就是SpringBoot使用spring retry重試機制的操作詳解的詳細內容,更多關于SpringBoot使用spring retry的資料請關注腳本之家其它相關文章!
相關文章
intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解
這篇文章主要介紹了intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09MyBatis的CRUD中的不同參數(shù)綁定查詢實現(xiàn)
本文主要介紹了MyBatis的CRUD中的不同參數(shù)綁定查詢實現(xiàn),主要包括單個參數(shù)傳遞綁定,序號參數(shù)傳遞綁定,注解參數(shù)傳遞綁定,pojo(對象)參數(shù)傳遞綁定,map參數(shù)傳遞綁定這幾種類型,具有一定的參考價值,感興趣的可以了解一下2023-12-12Java Validation Api如何實現(xiàn)自定義注解
這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09在?Spring?Boot?中使用?Quartz?調度作業(yè)的示例詳解
這篇文章主要介紹了在?Spring?Boot?中使用?Quartz?調度作業(yè)的示例詳解,在本文中,我們將看看如何使用Quartz框架來調度任務,Quartz支持在特定時間運行作業(yè)、重復作業(yè)執(zhí)行、將作業(yè)存儲在數(shù)據(jù)庫中以及Spring集成,需要的朋友可以參考下2022-07-07JavaWeb中獲取表單數(shù)據(jù)及亂碼問題的解決方法
這篇文章主要介紹了JavaWeb中獲取表單數(shù)據(jù)及亂碼問題的解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11