<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring @Retryable實(shí)現(xiàn)接口自動(dòng)重試

          共 2358字,需瀏覽 5分鐘

           ·

          2021-04-30 13:55

          背景:

          在實(shí)際項(xiàng)目中,我們?cè)谂c其他第三方業(yè)務(wù)接口進(jìn)行交互時(shí),可能會(huì)因?yàn)橐恍┚W(wǎng)絡(luò)波動(dòng)導(dǎo)致超時(shí)失敗,但是并不能只一次失敗就判定接口請(qǐng)求失敗,應(yīng)該考慮重試多次后如果仍然失敗,才返回請(qǐng)求失敗。


          解決方案:

          解決方案一:try-catch 簡(jiǎn)單重試

          通過(guò)判斷返回結(jié)果或監(jiān)聽(tīng)異常判定是否重試,同時(shí)為了解決立即重試的無(wú)效執(zhí)行(假設(shè)異常是有外部執(zhí)行不穩(wěn)定導(dǎo)致的),休眠一定延遲時(shí)間重新執(zhí)行功能邏輯。

            是這樣會(huì)存在一個(gè)問(wèn)題,那就是如果是請(qǐng)求參數(shù)不正常,那么就會(huì)一直重試下去,變成了死循環(huán)。

           

          這樣肯定不是我們想要的解決方案,所以我們需要添加限制,判斷重試多少次以后仍然失敗,那么返回失敗結(jié)果。


          然后這次再看執(zhí)行結(jié)果,這次就按照我們?cè)O(shè)置的次數(shù)進(jìn)行重試了,這樣看來(lái)已經(jīng)達(dá)到了業(yè)務(wù)需求。   

           


           結(jié)論:try-catch再加上提前設(shè)定重試次數(shù),這樣已可以滿足我們重試機(jī)制了,但是有沒(méi)有更簡(jiǎn)單的方法呢?答案是肯定的。

           

          解決方案二:Spring @Retryable 注解實(shí)現(xiàn)

          @Retryable是Spring提供的可重試注解,為了使用spring提供的重試機(jī)制

           

          pom文件中添加相應(yīng)的依賴

          <!-- spring retry 自動(dòng)重試機(jī)制-->
          <dependency>
          <groupId>org.springframework.retry</groupId>
          <artifactId>spring-retry</artifactId>
          <version>1.2.4.RELEASE</version>
          </dependency>
          <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.9.4</version>
          </dependency>
          <!-- spring retry 自動(dòng)重試機(jī)制-->

           

          啟動(dòng)類添加注解

          @EnableRetry

          在需要重試的方法上添加注解@Retryable

          @Retryable(value = Exception.class, maxAttempts = 3,
          backoff = @Backoff(delay = 2000L, multiplier = 1.5))

           

          然后繼續(xù)執(zhí)行測(cè)試方法、結(jié)果發(fā)現(xiàn)執(zhí)行了三次,然后輸出請(qǐng)求失敗語(yǔ)句。


            但是只是這樣并不滿足我們實(shí)際業(yè)務(wù),在實(shí)際業(yè)務(wù)中如果超過(guò)重試之后,一般需要記錄本次失敗原因,并且調(diào)用補(bǔ)償方法進(jìn)行業(yè)務(wù)處理,與消息推送,所以我們可以使用@Recover注解來(lái)實(shí)現(xiàn)超出重試次數(shù)后執(zhí)行補(bǔ)償方法。

             但是這里需要注意的是,@Recover聲明的方法必須與@Retryable聲明的方法返回值一致,不然補(bǔ)償方法會(huì)不生效。

          以下是Spring自動(dòng)重試注解的說(shuō)明

          @Retryable注解中的參數(shù)說(shuō)明:

          maxAttempts:最大重試次數(shù),默認(rèn)為3,如果要設(shè)置的重試次數(shù)為3,可以
          不寫;

          value:拋出指定異常才會(huì)重試
          include:和value一樣,默認(rèn)為空,當(dāng)exclude也為空時(shí),默認(rèn)所以異常
          exclude:指定不處理的異常

          backoff:重試等待策略,默認(rèn)使用@Backoff@Backoffvalue默認(rèn)為1000L
          我們?cè)O(shè)置為
          2000L

          @Backoff注解中的參數(shù)說(shuō)明:
          value:隔多少毫秒后重試,默認(rèn)為1000L,我們?cè)O(shè)置為3000L
          delay:和value一樣,但是默認(rèn)為0

          multiplier(指定延遲倍數(shù))默認(rèn)為0,表示固定暫停1秒后進(jìn)行重試,如果
          multiplier設(shè)置為1.5,則第一次重試為2秒,第二次為3秒,第三次為 4.5秒。


           

          如果對(duì)您有幫助 請(qǐng)點(diǎn)個(gè)關(guān)注,萬(wàn)分感謝
                    

                                          (QQ招聘群  710566091
                                           微信招聘群 請(qǐng)加圖圖微信)


          瀏覽 86
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩电影一级片 | 日韩性爱人人操 | 黄色成人视频在线免费看 | 无码成人网 | 免费看一区 |