亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Retry優(yōu)雅地實現(xiàn)方法重試機制

 更新時間:2025年06月19日 09:41:02   作者:超級小忍  
Spring?Retry?是?Spring?提供的一個模塊,它可以幫助我們以聲明式的方式為方法添加重試功能,從而提升系統(tǒng)的健壯性和可用性,下面我們就來看看如何使用Spring?Retry實現(xiàn)方法重試機制吧

前言

在實際的軟件開發(fā)中,尤其是在涉及網(wǎng)絡(luò)請求、數(shù)據(jù)庫操作或外部服務(wù)調(diào)用的場景下,我們常常會遇到一些臨時性故障(Transient Failures),例如網(wǎng)絡(luò)波動、數(shù)據(jù)庫連接超時、第三方 API 暫時不可用等。面對這些問題,一種常見的解決方案就是自動重試機制。

Spring Retry 是 Spring 提供的一個模塊,它可以幫助我們以聲明式的方式為方法添加重試功能,從而提升系統(tǒng)的健壯性和可用性。

一、什么是 Spring Retry?

Spring Retry 是 Spring 框架中的一個子項目,提供了對方法調(diào)用失敗后進行自動重試的支持。它不僅支持簡單的重試邏輯,還支持重試策略、回退策略以及與 Spring AOP 集成,使得我們可以非常方便地在業(yè)務(wù)代碼中加入重試邏輯。

二、Spring Retry 的核心組件

1. RetryTemplate

RetryTemplate 是 Spring Retry 的核心類之一,它封裝了重試邏輯的執(zhí)行過程。你可以通過配置 RetryPolicy 和 BackOffPolicy 來定義重試次數(shù)和等待策略。

RetryTemplate retryTemplate = new RetryTemplate();

// 設(shè)置最多重試3次(包括第一次嘗試)
retryTemplate.setRetryPolicy(new SimpleRetryPolicy(3));

// 設(shè)置固定間隔2秒再重試
retryTemplate.setBackOffPolicy(new FixedBackOffPolicy(2000L));

retryTemplate.execute(context -> {
    // 調(diào)用可能會失敗的方法
    someService.doSomething();
    return null;
});

2. RetryPolicy

定義哪些異常需要重試,以及最大重試次數(shù)。常用的有:

  • SimpleRetryPolicy:基于次數(shù)的重試。
  • ExceptionClassifierRetryPolicy:根據(jù)異常類型決定是否重試。
  • NeverRetryPolicy:從不重試。
  • AlwaysRetryPolicy:無限重試。

3. BackOffPolicy

定義重試之間的等待策略。常用的有:

  • FixedBackOffPolicy:固定時間間隔。
  • ExponentialBackOffPolicy:指數(shù)退避策略(推薦)。
  • NoBackOffPolicy:不等待。

4. RetryListener

可以監(jiān)聽重試的不同階段,比如開始、重試、結(jié)束等事件,用于日志記錄或監(jiān)控。

三、使用注解方式實現(xiàn)重試(推薦)

Spring Retry 支持通過注解的方式簡化重試邏輯的編寫,只需在方法上添加 @Retryable 注解即可。

1. 引入依賴(Maven)

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

<!-- 同時需要啟用 AspectJ -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.7</version>
</dependency>

2. 啟用 Retry 功能

在配置類或啟動類上加上 @EnableRetry 注解:

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

3. 在方法上使用 @Retryable

@Service
public class MyService {

    @Retryable(maxAttempts = 3, backoff = @Backoff(delay = 2000))
    public void doSomething() {
        // 可能拋出異常的方法體
        if (Math.random() < 0.7) {
            throw new RuntimeException("Temporary failure");
        }
        System.out.println("Success!");
    }
}

上面的例子表示:

  • 最多嘗試 3 次;
  • 每次失敗后等待 2 秒;
  • 默認(rèn)只對 RuntimeException 進行重試。

你也可以指定特定異常:

@Retryable(value = {IOException.class}, maxAttempts = 5)

或者排除某些異常:

@Retryable(exclude = {SQLException.class})

四、@Retryable 注解參數(shù)詳解

在使用 Spring Retry 的注解方式時,@Retryable 是最核心的注解之一。它提供了多個可配置項,用于定義方法的重試行為。下面是一個詳細(xì)的參數(shù)說明表:

參數(shù)名類型默認(rèn)值描述
value / includeClass<? extends Throwable>[]{RuntimeException.class}指定需要重試的異常類型,默認(rèn)對所有 RuntimeException 進行重試。
excludeClass<? extends Throwable>[]{}排除某些異常類型,這些異常不會觸發(fā)重試。
maxAttemptsint3最大嘗試次數(shù)(包括第一次調(diào)用)。
maxAttemptsExpressionStringnull支持通過 SpEL 表達(dá)式動態(tài)設(shè)置最大嘗試次數(shù)。
backoffBackoff@Backoff(delay = 1000L)設(shè)置退避策略,如固定延遲、指數(shù)退避等。
interceptorBeanNameString""自定義攔截器 Bean 名稱(不常用)。
labelString""給重試操作添加標(biāo)簽,可用于監(jiān)聽器識別。
statefulbooleanfalse是否為有狀態(tài)重試(適用于冪等性要求高的場景)。

示例:更復(fù)雜的 @Retryable 配置

@Retryable(
    value = {IOException.class, TimeoutException.class},
    exclude = SQLException.class,
    maxAttempts = 5,
    backoff = @Backoff(delay = 2000, multiplier = 1.5, maxDelay = 10000),
    stateful = true
)
public void retryableMethod() {
    // 方法邏輯
}

在這個例子中:

  • 只對 IOException 和 TimeoutException 進行重試;
  • 排除 SQLException;
  • 最多重試 5 次;
  • 使用指數(shù)退避策略,初始延遲 2 秒,每次乘以 1.5 倍,最長延遲不超過 10 秒;
  • 啟用了有狀態(tài)重試(適合涉及外部狀態(tài)變更的操作);

五、高級用法:結(jié)合監(jiān)聽器

你可以通過自定義監(jiān)聽器來記錄每次重試的日志信息:

@Component
public class MyRetryListener implements RetryListener {

    @Override
    public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
        System.out.println("Retry: Open");
        return true;
    }

    @Override
    public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        System.out.println("Retry: Close");
    }

    @Override
    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        System.out.println("Retry: Error occurred, attempt " + context.getRetryCount());
    }
}

然后注冊到 RetryTemplate 中:

retryTemplate.registerListener(new MyRetryListener());

六、注意事項

冪等性問題:重試操作必須是冪等的,否則重復(fù)執(zhí)行可能導(dǎo)致數(shù)據(jù)錯誤。

事務(wù)控制:如果方法處于事務(wù)中,注意事務(wù)傳播行為,避免因重試引發(fā)事務(wù)沖突。

性能影響:合理設(shè)置重試次數(shù)和等待時間,防止系統(tǒng)負(fù)載過高。

異步 vs 同步:Spring Retry 是同步的,如需異步重試需自行結(jié)合線程池處理。

七、總結(jié)

Spring Retry 是一個輕量但功能強大的重試框架,它通過模板模式和注解方式幫助開發(fā)者快速實現(xiàn)方法級別的自動重試。無論是在微服務(wù)調(diào)用、消息消費、數(shù)據(jù)庫訪問等場景中,都可以靈活應(yīng)用。

合理使用 Spring Retry,可以讓我們的系統(tǒng)更加健壯,有效應(yīng)對各種瞬時故障。

到此這篇關(guān)于Spring Retry優(yōu)雅地實現(xiàn)方法重試機制的文章就介紹到這了,更多相關(guān)Spring Retry方法重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中@Configuration使用場景

    java中@Configuration使用場景

    本文主要介紹了java中@Configuration使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 使用Aop的方式實現(xiàn)自動日志記錄的方式詳細(xì)介紹

    使用Aop的方式實現(xiàn)自動日志記錄的方式詳細(xì)介紹

    這篇文章主要介紹了使用Aop的方式實現(xiàn)自動日志記錄,通過監(jiān)聽器去監(jiān)聽,當(dāng)訪問到具體的類方法,通過aop切面去獲取訪問的方法,然后將日志記錄下來,就這種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題

    解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題

    這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時不經(jīng)過代理類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java中關(guān)于return返回值的用法詳解

    java中關(guān)于return返回值的用法詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java中關(guān)于return返回值的用法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • JavaWeb之Ajax的基本使用與實戰(zhàn)案例

    JavaWeb之Ajax的基本使用與實戰(zhàn)案例

    ajax技術(shù)是使頁面能局部刷新的一種技術(shù),下面這篇文章主要給大家介紹了關(guān)于JavaWeb之Ajax的基本使用與實戰(zhàn)案例的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Struts2學(xué)習(xí)教程之輸入校驗示例詳解

    Struts2學(xué)習(xí)教程之輸入校驗示例詳解

    這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之輸入校驗的相關(guān)資料,文中通過示例介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用struts2具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • 一起因MySQL時間戳精度引發(fā)的血案分析

    一起因MySQL時間戳精度引發(fā)的血案分析

    這篇文章主要給大家介紹了一起因MySQL時間戳精度引發(fā)的血案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    最近需要做?個把多個pdf報告合并成?個以?便預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于java操作PDF文件方法之轉(zhuǎn)換、合成、切分的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 2019年最新Java學(xué)習(xí)路線圖

    2019年最新Java學(xué)習(xí)路線圖

    不管你是不懂電腦的小白,還是已經(jīng)步入開發(fā)的大牛,這套路線路絕對不容錯過,路線圖的宗旨就是分享,專業(yè),便利,讓喜愛Java的人,都能平等的學(xué)習(xí),感興趣的同學(xué)可以了解一下
    2019-03-03

最新評論