<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在SpringBoot中重試調用第三方API教程

jf_78858299 ? 來源:JAVA旭陽 ? 作者:JAVA旭陽 ? 2023-05-11 10:43 ? 次閱讀

前言

作為后端程序員,我們的日常工作就是調用一些第三方服務,將數據存入數據庫,返回信息給前端。但你不能保證所有的事情一直都很順利。像有些第三方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
    API
    +關注

    關注

    2

    文章

    1395

    瀏覽量

    61028
  • 數據庫
    +關注

    關注

    7

    文章

    3602

    瀏覽量

    63471
  • spring
    +關注

    關注

    0

    文章

    333

    瀏覽量

    14172
  • SpringBoot
    +關注

    關注

    0

    文章

    172

    瀏覽量

    112
收藏 人收藏

    評論

    相關推薦

    如何打開第三方軟件

    請問大神們 誰知道如何在Labview 打開第三方軟件,我現在想打開工程后 自動打開USB視頻采集卡,然后就直接顯示出采集卡采集到的圖像了請問如何打開在這先謝過了
    發表于 09-11 16:26

    如何把第三方庫加到PROTEUS?

    新手求教,弱弱的問下,下了一個第三方庫,說是要先安裝,再添加路徑,可是我下來的第三方庫沒有看到安裝文件啊。還望指教如何添加!
    發表于 06-15 22:32

    關于proteus第三方元件庫的問題

    下了兩個第三方元件庫,然后就不知道放哪了,也不知道怎么調用。百度不到,求大神解答。謝了!
    發表于 11-13 08:56

    如何在LabVIEW嵌入第三方軟件界面

    如何把第三方軟件的界面嵌入到labview,并且能夠LabVIEW的前面板第三方軟件進行操作。LabVIEW中有Active用于IE
    發表于 04-27 23:06

    labview 通過API調用第三方軟件 無法通過ID獲取窗口元素的句柄

    labview 通過API調用第三方軟件無法通過ID獲取窗口元素的句柄
    發表于 12-11 17:41

    第三方dll調用問題?。?!

    第三方dll,沒有.h,labview怎么實現調用,dll可以用VS打開,類庫說明也有
    發表于 05-11 09:14

    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

    第三方APP如何獲取HDMI IN畫面和聲音

    問題描述及復現步驟:官方提供了一個Live TV能夠預覽HDMI IN的畫面, 第三方應用如何獲取HDMI IN的畫面和聲音??是否提供著這樣的獲取接口供第三方APP調用?
    發表于 09-08 16:34

    Framework下調用第三方的C++算法庫

    我這里是JNI調用一個語音處理庫,這些庫廠商會以非開源的so庫文件形式提供。JNI在編譯時需要依賴它,所以需要先預編譯安裝第三方庫。解決方法:同一個Android.mk編寫就行:L
    發表于 11-24 17:37

    調用第三方 API 接口會遇到哪些問題

    了 11、接口時好時壞 12、文檔和接口邏輯不一致 13、欠費了 ? 前言 在實際工作中,我們經常需要在項目中調用第三方API接口,獲取數據,或者上報數據,進行數據交換和通信。 那么,調用
    的頭像 發表于 05-29 14:31 ?959次閱讀

    調用第三方API接口會遇到哪些問題?如何解決?

    在實際工作中,我們經常需要在項目中調用第三方API接口,獲取數據,或者上報數據,進行數據交換和通信。
    的頭像 發表于 11-30 11:05 ?850次閱讀
    <b class='flag-5'>調用</b><b class='flag-5'>第三方</b><b class='flag-5'>API</b>接口會遇到哪些問題?如何解決?
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>