前言
作為后端程序員,我們的日常工作就是調用一些第三方服務,將數據存入數據庫,返回信息給前端。但你不能保證所有的事情一直都很順利。像有些第三方API,偶爾會出現超時。此時,我們要重試幾次,這取決于你的重試策略。
下面舉一個我在日常開發中多次看到的例子:
public interface OutSource {
List;
}
@Service
public class OutSourceImpl implements OutSource {
static Random random = new Random();
@Override
public List{
//mock failure
if (random.nextInt(2) == 1)
throw new TimeOutException();
return List.of(1, 2, 3);
}
}
@Slf4j
@Service
public class ManuallyRetryService {
@Autowired
private OutSource outSource;
public List{
log.info("trigger time:{}", retryTimes);
if (retryTimes > 3) {
return List.of();
}
try {
List
看看上面這段代碼,我認為它可以正常工作,當retryTimes達到4時,無論如何我們都會得到最終結果。但是你覺得寫的好嗎?優雅嗎?下面我來介紹Spring中的一個組件:spring-retry,我們不妨來試一試。
Spring-Retry介紹使用
spring-retry是Spring中的提供的一個重試框架,提供了注解的方式,在不入侵原有業務邏輯代碼的方式下,優雅的實現重處理功能。
安裝依賴
- 如果你的是gradle應用,引入下面的依賴
implementation 'org.springframework.boot:spring-boot-starter-aop''org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.retry:spring-retry'
- 如果你的項目使用的是maven項目,引入下面的依賴
<dependency>
<groupId>org.springframework.retry<span class="hljs-name"groupId>
<artifactId>spring-retry<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-aop<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
啟用重試功能
添加@EnableRetry注解在入口的類上從而啟用功能。
@SpringBootApplication
//看過來
@EnableRetry
public class TestSpringApplication {
public static void main(String[] args) {
SpringApplication.run(TestSpringApplication.class, args);
}
}
應用
我們以前面的為例,看看怎么使用,如下面的代碼:
public interface OutSource {
List;
}
@Service
public class OutSourceImpl implements OutSource {
static Random random = new Random();
@Override
public List{
//mock failure will throw an exception every time
throw new TimeOutException();
}
}
@Slf4j
@Service
public class RetryableService {
@Autowired
private OutSource outSource;
// 看這里
@Retryable(value = {TimeOutException.class}, maxAttempts = 3)
public List{
log.info("trigger timestamp:{}", System.currentTimeMillis() / 1000);
List
- 關鍵在于
Service層中的實現類中添加了@Retryable注解,實現了重試, 指定value是TimeOutException異常會進行重試,最大重試maxAttempts3次。
驗證
這一次,當我們訪問http://localhost:8080/retryable時,我們將看到瀏覽器上的結果失敗。然后在你的終端上看到:
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236840
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236841
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236842
ERROR 66776 --- [nio-9997-exec-1] c.m.t.controller.RetryTestController : retryable final exception
總結
本文分享了spring-retry重試框架最基礎的使用,可以無侵入業務代碼進行重試。關于spring-retry更多的使用建議可以自己去官網https://github.com/spring-projects/spring-retry 探索。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
API
+關注
關注
2文章
2368瀏覽量
66752 -
數據庫
+關注
關注
7文章
4019瀏覽量
68335 -
spring
+關注
關注
0文章
341瀏覽量
15935 -
SpringBoot
+關注
關注
0文章
177瀏覽量
684
發布評論請先 登錄
相關推薦
熱點推薦
如何在LabVIEW中嵌入第三方軟件界面
如何把第三方軟件的界面嵌入到labview中,并且能夠在LabVIEW的前面板中對第三方軟件進行操作。LabVIEW中有Active用于IE
發表于 04-27 23:06
LabVIEW與第三方軟件交互問題
現在做一個軟件,就是通過LabVIEW去與第三方軟件進行交互操作!已經通過百度找到了利用user32.dll調用FindWindowA與PostMessage去實現對計算器,找了多方資料也沒有找到解決辦法。想做一個軟件就是對圖片2中
發表于 12-26 17:13
國內知名第三方檢測認證機構排名
的檢測機構介入,成熟的第三方檢測機構介入商品檢測在十九世紀中葉已經很普遍了,并成為一種自覺的商業行為。目前中國已經成為了全球貿易大國,經濟實力躍居世界第二,強勁的對外貿易增長態勢促進了檢測行業的不斷
發表于 07-19 16:57
關于LabVIEW調用第三方exe,如何去控制第三方exe按鈕的問題
我想調用第三方的exe,但并沒有給出任何接口,就單單一個exe程序,通過查資料得出可以用window自帶的user32.dll可以控制第三方的軟件,通過FindWindowA函數找到該軟件句柄,通過
發表于 08-12 16:37
頭文件中包含第三方文件
macrocmake如果源文件(例如 CPP)中包含第三方頭文件,但是頭文件(例如 hpp)中不包含該第三方文件頭,采用 PRIVATE。如果源文件和頭文件中都包含該
發表于 08-18 08:10
鴻蒙開源第三方組件資料合集
1、鴻蒙開源第三方組件——日志工具組件Timber_ohosTimber_ohos是一個帶有小型可擴展API的日志工具組件,它可以給開發者提供統一的API接口,來記錄不同類型的日志,幫助開發者管理
發表于 03-23 09:53
在Framework下調用第三方的C++算法庫
我這里是JNI調用一個語音處理庫,這些庫廠商會以非開源的so庫文件形式提供。JNI在編譯時需要依賴它,所以需要先預編譯安裝第三方庫。解決方法:在同一個Android.mk中編寫就行:L
發表于 11-24 17:37
鴻蒙開發中怎么引入第三方庫
多個 API 外也是支持組件庫的調用的,那么鴻蒙應用開發是如何與第三方庫銜接的呢? 加載一張圖片是每個應用所需的功能,在 Android 平臺提供的有 Glide、ImageLoad
調用第三方 API 接口會遇到哪些問題
了 11、接口時好時壞 12、文檔和接口邏輯不一致 13、欠費了 ? 前言 在實際工作中,我們經常需要在項目中調用第三方API接口,獲取數據
谷歌開放ZenDeviceEffects API,助第三方應用實現睡前屏幕管理
據報道,谷歌近日在安卓 15 開發者預覽版 2 中推出了全新 ZenDeviceEffects API,允許第三方應用訪問數字健康的就寢模式功能。
如何集成第三方支付API到電商網站
? 在電商網站中,集成第三方支付API是確保交易安全、提升用戶體驗的關鍵步驟。本文將逐步指導您完成整個流程,從選擇支付提供商到上線后的監控。文章結構清晰,包含代碼示例和實用建議,幫助您
在SpringBoot中重試調用第三方API教程
評論