SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能
使用背景
在有些特定場(chǎng)景,如和第三方對(duì)接。
我們調(diào)用接口時(shí)需要支持重試功能,第一次調(diào)用沒成功,我們需要等待x秒后再次調(diào)用。
通常會(huì)設(shè)置重試次數(shù),避免業(yè)務(wù)。
一般我們會(huì)這樣寫
public ApiResponse<Boolean> test() {
//模擬調(diào)用
System.out.println("開始調(diào)用,第" + num + "次");
//業(yè)務(wù)邏輯
boolean result = false;
if (result) {
System.out.println("執(zhí)行完成!");
} else if (num >= totalNum) {
System.out.println("重試結(jié)束");
num = 1;
} else {
System.out.println("重試");
++num;
test();
}
return ApiResponse.ok(true);
}這樣寫本身,沒什么問題。
但是如果多個(gè)接口都需要重試的話,代碼就不優(yōu)雅了。
spring-retry介紹
spring系列的spring-retry是另一個(gè)實(shí)用程序模塊,
可以幫助我們以標(biāo)準(zhǔn)方式處理任何特定操作的重試。
在spring-retry中,所有配置都是基于簡(jiǎn)單注釋的。
快速使用
加入依賴
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
開啟Retry
啟動(dòng)上增加注解@EnableRetry
@EnableRetry
使用
@GetMapping("test")
@Retryable(value = Exception.class,maxAttempts = 5,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public ApiResponse<Boolean> test() {
System.out.println("開始調(diào)用,第" + num + "次");
boolean result = false;
if (!result){
num++;
throw new BizException("調(diào)用失敗,需要重試");
}
System.out.println("執(zhí)行完成");
return ApiResponse.ok(true);
}參數(shù)
value:拋出指定異常才會(huì)重試
include:和value一樣,默認(rèn)為空,當(dāng)exclude也為空時(shí),默認(rèn)所有異常
exclude:指定不處理的異常
maxAttempts:最大重試次數(shù),默認(rèn)5次
backoff:重試等待策略,默認(rèn)使用@Backoff,@Backoff的value默認(rèn)為1000L,我們?cè)O(shè)置為2000L;multiplier(指定延遲倍數(shù))默認(rèn)為0,表示固定暫停1秒后進(jìn)行重試,如果把multiplier設(shè)置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。
到此這篇關(guān)于SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能的文章就介紹到這了,更多相關(guān)SpringBoot實(shí)現(xiàn)重試功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaFX程序初次運(yùn)行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解
這篇文章主要介紹了JavaFX程序初次運(yùn)行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Java并發(fā)編程之Semaphore的使用簡(jiǎn)介
這篇文章主要介紹了Java并發(fā)編程之Semaphore的使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04
Java8實(shí)現(xiàn)Stream流的合并的方法展示
本文介紹了Java8中Stream流的合并方法,包括concat()、flatMap()和reduce()三種方法。其中,concat()方法可以將兩個(gè)Stream流合并成一個(gè),flatMap()方法可以將一個(gè)Stream流中的元素映射成多個(gè)Stream流并合并成一個(gè),reduce()方法可以將Stream流中的元素逐個(gè)合并成一個(gè)結(jié)果2023-05-05
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之前綴,中綴和后綴表達(dá)式
這篇文章主要為大家介紹了Java的前綴,中綴和后綴表達(dá)式 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例
這篇文章主要介紹了Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Spring事務(wù)和事務(wù)傳播機(jī)制操作大全
Spring中事務(wù)管理主要分為編程式事務(wù)和聲明式事務(wù),聲明式事務(wù)推薦使用,聲明式事務(wù)通過`@Transactional`注解實(shí)現(xiàn),可以簡(jiǎn)化事務(wù)操作,本文給大家介紹Spring事務(wù)和事務(wù)傳播機(jī)制,感興趣的朋友跟隨小編一起看看吧2025-12-12

