欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用注解@Recover優(yōu)化丑陋的循環(huán)詳解

 更新時間:2022年04月21日 10:23:15   作者:MobiusStrip  
我們知道在實(shí)現(xiàn)一個功能的時候是可以使用不同的代碼來實(shí)現(xiàn)的,那么相應(yīng)的不同實(shí)現(xiàn)方法的性能肯定也是有差別的,下面這篇文章主要給大家介紹了關(guān)于使用注解@Recover優(yōu)化丑陋的循環(huán)的相關(guān)資料,需要的朋友可以參考下

1使用背景

在實(shí)際項(xiàng)目中其中一部分邏輯可能會因?yàn)檎{(diào)用了外部服務(wù)或者等待鎖等情況下出現(xiàn)不可預(yù)料的異常,在這個時候我們可能需要對調(diào)用這部分邏輯進(jìn)行重試,代碼里面主要就是使用for循環(huán)寫一大坨重試的邏輯,各種硬編碼,各種辣眼睛的補(bǔ)丁。

特別是針對重試的邏輯,到處都有。所以我決定用一個重試組件spring-retry優(yōu)化一波。它的出現(xiàn),解決掉這部分丑陋的代碼!

這個組件的源碼地址如下:https://github.com/spring-projects/spring-retry

廢話不多說,直接上代碼吧!

2開始上代碼

首先引入依賴:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.3.2</version>
</dependency>

由于該組件是依賴于 AOP 給你的,所以還需要引入這個依賴(如果你其他 jar 包中引用過了,當(dāng)然也就不需要再次引用了):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.6.1</version>
</dependency>

開啟重試:

@SpringBootApplication
@EnableRetry
public class ApplicationStarter {
  public static void main(String[] args) {
  SpringApplication.run(ApplicationStarter.class);
  }
}

Controller層

@RestController
public class TestController {
@Autowired
private IRecursiveCallService recursiveCallService;
 
    @GetMapping("test2")
    public Object test2() {
        return recursiveCallService.testService();
    }
}

Service層

public interface IRecursiveCallService {
    /**
     * 測試service
     *
     * @return
     */
    List<Integer> testService();
}

Service層具體實(shí)現(xiàn)

@Service
public class RecursiveCallServiceImpl implements IRecursiveCallService {
 
    @Override
    @Retryable(recover = "testService3")
    public List<Integer> testService() {
        System.out.println("到此一游!");
        System.out.println(1 / 0);
        return null;
    }
 
    @Recover
    public List<String> testService1() {
        System.out.println("錯誤的返回");
        return Collections.singletonList("S");
    }
 
    @Recover
    public List<Integer> testService2(String i) {
        System.out.println("正確的返回");
        return Collections.singletonList(1);
    }
 
    @Recover
    public List<Integer> testService3() {
        System.out.println("正確的返回2");
        return Collections.singletonList(2);
    }
}

3@Retryable注解重要屬性解析

  • recover: 此類中用于恢復(fù)的方法的名稱。方法必須用 {@link Recover} 注釋標(biāo)記。
  • value: 可重試的異常類型。包括()的同義詞。默認(rèn)為空(如果 excludes 也為空,則重試所有異常)。
  • exclude: 不可重試的異常類型。默認(rèn)為空(如果包含也為空,則重試所有異常)。如果 include 為空但 excludes 不是,則重試所有未排除的異常
  • maxAttempts: 方法重試調(diào)用次數(shù),默認(rèn)3次
  • backoff: 指定用于重試此操作的其他屬性

4@backoff注解

  • value:重試之間間隔時間
  • delay:重試之間的等待時間(以毫秒為單位)
  • maxDelay:重試之間的最大等待時間(以毫秒為單位)
  • multiplier:指定延遲的倍數(shù)
  • delayExpression:重試之間的等待時間表達(dá)式
  • maxDelayExpression:重試之間的最大等待時間表達(dá)式
  • multiplierExpression:指定延遲的倍數(shù)表達(dá)式
  • random:隨機(jī)指定延遲時間

5@Recover注解

主要作用是標(biāo)記方法為一個重試方法的補(bǔ)償方法?。?!

6注意事項(xiàng)

方法重試依賴于 spring 注入,所以調(diào)用的方法的類必須是被spring管理的,然后通過 @Autowired 或 @Resource 引入使用,不然不會生效

方法重試的前提是方法拋出了異常,在方法執(zhí)行出現(xiàn)了異常且沒有被捕獲的情況下重試

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

方法重試的補(bǔ)償方法上面必須攜帶@Recover注解

@Recover方法需要和@Retryable方法在同一個類中才能生效@Recover方法(@Recover方法在父類中也可以生效)

使用@Retryable注解,如果類中沒有被@Recover標(biāo)示的方法,無論是否使用 recover 屬性都拋出原有異常

使用@Retryable注解同時 recover 屬性不是空,如果類中有@Recover標(biāo)示的方法,但是標(biāo)示的方法不是 recover 指定的方法,拋出ExhaustedRetryException異常

使用@Retryable注解同時 recover 屬性不是空,同時方法有注解@Recover,但是補(bǔ)償方法的參數(shù)不是當(dāng)前異?;蛘弋惓5母割?,拋出ExhaustedRetryException 異常

使用@Retryable注解不使用 recover 屬性,如果類中被@Recover標(biāo)示的方法有和原方法返回值一樣的,使用當(dāng)前被@Recover標(biāo)示的方法(此時方法參數(shù)可隨意,但是不能是除開當(dāng)前異常的類及父類的異常類)

總結(jié)

到此這篇關(guān)于使用注解@Recover優(yōu)化丑陋的循環(huán)的文章就介紹到這了,更多相關(guān)注解@Recover優(yōu)化循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Future與FutureTask接口實(shí)現(xiàn)示例詳解

    Future與FutureTask接口實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Future與FutureTask接口實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 關(guān)于spring的自定義緩存注解分析

    關(guān)于spring的自定義緩存注解分析

    這篇文章主要介紹了關(guān)于spring的自定義緩存注解分析,因?yàn)樗械膋ey的失效時間都一樣,要想實(shí)現(xiàn)不同的key不同的失效時間,就得需要自定義緩存注解,需要的朋友可以參考下
    2023-05-05
  • java實(shí)現(xiàn)一個簡單的Web服務(wù)器實(shí)例解析

    java實(shí)現(xiàn)一個簡單的Web服務(wù)器實(shí)例解析

    這篇文章主要介紹了java實(shí)現(xiàn)一個簡單的Web服務(wù)器實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • MyBatis關(guān)閉一級緩存的兩種方式(分注解和xml兩種方式)

    MyBatis關(guān)閉一級緩存的兩種方式(分注解和xml兩種方式)

    這篇文章主要介紹了MyBatis關(guān)閉一級緩存的兩種方式(分注解和xml兩種方式),mybatis默認(rèn)開啟一級緩存,執(zhí)行2次相同sql,但是第一次查詢sql結(jié)果會加工處理這個時候需要關(guān)閉一級緩存,本文給大家詳細(xì)講解需要的朋友可以參考下
    2022-11-11
  • 淺談SpringCloud之zuul源碼解析

    淺談SpringCloud之zuul源碼解析

    這篇文章主要介紹了淺談SpringCloud之zuul源碼解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • java 語句塊的使用詳解及實(shí)例

    java 語句塊的使用詳解及實(shí)例

    這篇文章主要介紹了java 用語句塊的正確方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • PowerJob UseCacheLock工作流程源碼剖析

    PowerJob UseCacheLock工作流程源碼剖析

    這篇文章主要為大家介紹了PowerJob UseCacheLock工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Java八種基本變量作為類的成員變量的默認(rèn)值操作

    Java八種基本變量作為類的成員變量的默認(rèn)值操作

    這篇文章主要介紹了Java八種基本變量作為類的成員變量的默認(rèn)值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 親手帶你解決Debug Fastjson的安全漏洞

    親手帶你解決Debug Fastjson的安全漏洞

    這篇文章主要介紹了親手帶你解決Debug Fastjson的安全漏洞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 高內(nèi)聚低耦合法則實(shí)例解析

    高內(nèi)聚低耦合法則實(shí)例解析

    這篇文章主要介紹了高內(nèi)聚低耦合法則實(shí)例代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論