SpringBoot使用spring retry重試機(jī)制的操作詳解
重試在功能設(shè)計(jì)上需要根據(jù)應(yīng)用場(chǎng)景進(jìn)行設(shè)計(jì),讀數(shù)據(jù)的接口比較適合重試的場(chǎng)景,寫數(shù)據(jù)的接口就需要注意接口的冪等性了,還有就是重試次數(shù)如果太多的話會(huì)導(dǎo)致請(qǐng)求量加倍,給后端造成更大的壓力,設(shè)置合理的重試機(jī)制是關(guān)鍵;
Spring Retry重試框架
Spring boot使用spring retry重試機(jī)制
1.pom引用
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
2.應(yīng)用啟動(dòng)類開啟retry
@EnableRetry
public class Application {
.......
}
3.在指定方法上標(biāo)記@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ā)生的異常進(jìn)行重試
include: 和value一樣,默認(rèn)空,當(dāng)exclude也為空時(shí),所有異常都重試
exclude: 指定異常不重試,默認(rèn)空,當(dāng)include也為空時(shí),所有異常都重試
maxAttemps: 重試次數(shù),默認(rèn)3
backoff: 重試補(bǔ)償機(jī)制,默認(rèn)沒有
4.在指定方法上標(biāo)記@Recover來開啟重試失敗后調(diào)用的方法(注意,需跟重處理方法在同一個(gè)類中)
@Recover
public void recover(RuntimeException e) {
// ... do something
}
使用詳解
spring-retry通過AOP實(shí)現(xiàn)對(duì)目的方法的封裝,執(zhí)行在當(dāng)前線程下,所以重試過程中當(dāng)前線程會(huì)堵塞。如果BackOff時(shí)間設(shè)置比較長(zhǎng),最好起異步線程重試(也可以加@Async注解)。
@Retryable注解
被注解的方法發(fā)生異常時(shí)會(huì)重試
value:指定發(fā)生的異常進(jìn)行重試
include:和value一樣,默認(rèn)空,當(dāng)exclude也為空時(shí),所有異常都重試
exclude:指定異常不重試,默認(rèn)空,當(dāng)include也為空時(shí),所有異常都重試
maxAttemps:重試次數(shù),默認(rèn)3
backoff:重試補(bǔ)償機(jī)制,默認(rèn)沒有
@Backoff注解
delay:指定延遲后重試
multiplier:指定延遲的倍數(shù),比如delay=5000l,multiplier=2時(shí),第一次重試為5秒后,第二次為10秒,第三次為20秒
@Recover
當(dāng)重試到達(dá)指定次數(shù)時(shí),被注解的方法將被回調(diào),可以在該方法中進(jìn)行日志處理。需要注意的是發(fā)生的異常和入?yún)㈩愋鸵恢聲r(shí)才會(huì)回調(diào)
spring-retry踩坑
一、@Retryable未生效可能原因
@Retryable方法必須為 public
下面情況下@Retryable不生效,即重試方法與調(diào)用它的非重試方法在同一個(gè)類中。
// 注意 此方法不生效?。?!
@EnableRetry(proxyTargetClass = true)
class test{
public void methodA(){
methodB();
}
@Retryable
public void methodB(){
}
}
解決方案:將重試方法單獨(dú)寫了一個(gè)Service。
3.每個(gè)類中對(duì)一種異常只有一個(gè)重試方法。兩個(gè)重試方法捕捉Exception,重試失效。
二、@Recover未生效可能原因
①返回值必須和被重試的函數(shù)返回值一致;
②參數(shù)中除了第一個(gè)是觸發(fā)的異常外,后面的參數(shù)需要和被重試函數(shù)的參數(shù)列表一致;
③當(dāng)然這里的返回值部分也可以再做一次手動(dòng)重試,但是已經(jīng)嘗試那么多次都失敗了,所以在兜底函數(shù)中再做一次也意義不大。因此我的考慮是,這里就用來做日志記錄就好。
以上就是SpringBoot使用spring retry重試機(jī)制的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot使用spring retry的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于SpringBoot實(shí)現(xiàn)HTTP請(qǐng)求簽名驗(yàn)證機(jī)制
在分布式系統(tǒng)交互中,API接口的安全性至關(guān)重要,本文將深入解析基于Spring Boot實(shí)現(xiàn)的HTTP請(qǐng)求簽名驗(yàn)證機(jī)制,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼兩種解決方式
jar包啟動(dòng),今天java開發(fā)過來找,說jar包啟動(dòng)日志是亂碼,這篇文章主要給大家介紹了關(guān)于Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼的兩種解決方式,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
SpringBoot自動(dòng)裝配原理詳細(xì)解析
這篇文章主要介紹了SpringBoot自動(dòng)裝配原理詳細(xì)解析,一個(gè)對(duì)象交給Spring來管理的三種方式 @Bean @Compoment @Import,2024-01-01
@Bean主要在@Configuration中,通過方法進(jìn)行注入相關(guān)的Bean,@Compoent與@Service歸為一類,在類上加注入對(duì)應(yīng)的類,需要的朋友可以參考下
還在用if(obj!=null)做非空判斷,帶你快速上手Optional
這篇文章主要介紹了還在用if(obj!=null)做非空判斷,帶你快速上手Optional,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
簡(jiǎn)單學(xué)習(xí)Java抽象類要點(diǎn)及實(shí)例
這篇文章主要介紹了Java抽象類要點(diǎn)及實(shí)例,有需要的朋友可以參考一下2014-01-01
log4j2采用AsyncLogger出現(xiàn)的錯(cuò)誤及解決方案
這篇文章主要介紹了log4j2采用AsyncLogger出現(xiàn)的錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringMVC框架使用jackson封裝數(shù)據(jù)過程中遇到的問題及解決
這篇文章主要介紹了SpringMVC框架使用jackson封裝數(shù)據(jù)過程中遇到的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05
Java實(shí)現(xiàn)圖片轉(zhuǎn)base64完整代碼示例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)圖片轉(zhuǎn)base64的相關(guān)資料,Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法,需要的朋友可以參考下2023-12-12

