SpringBoot @Retryable注解使用
前言
在使用第三方接口的時候,一般都會有一些類似登錄客戶端的處理,或者發(fā)送消息這些場景,有時候會出現(xiàn)網(wǎng)絡(luò)抖動、連接超時等異常,這時候就需要進(jìn)行多次重試。
一般如果我們自己實(shí)現(xiàn)重試機(jī)制,都是使用循環(huán),但是這樣并不優(yōu)雅。
在SpringBoot中已經(jīng)提供了實(shí)現(xiàn)重試機(jī)制的功能——@Retryable注解,可以在不侵入原有邏輯代碼的方式下,優(yōu)雅的實(shí)現(xiàn)重處理功能。
一、@Retryable是什么?
@Retryable是Spring提供的可重試注解,該注解一般用于方法上,實(shí)現(xiàn)方法的重試機(jī)制。

二、使用步驟
POM依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>啟動@Retryable
在啟動類上加上@EnableRetry,開啟重試機(jī)制。
@EnableRetry
@SpringBootApplication
public class SpringBootRetryApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootRetryApplication.class, args);
}
}Service類
在需要重試方法上加上@Restryable
@Slf4j
@Service
public class LoginService {
@Retryable(value = Exception.class, maxAttempts = 5, backoff = @Backoff(delay = 2000L, multiplier = 1))
public void login(boolean isRetry) throws Exception {
log.info("----------開始登錄----------");
if (isRetry) {
throw new Exception("重試登錄");
}
}
}這里解釋一下@Retryable常用的幾個參數(shù)的含義:
- value:拋出指定的異常才會重試
- include:和value一樣,默認(rèn)為空,當(dāng)exclude也為空時,默認(rèn)所有異常
- exclude:指定不處理的異常
- maxAttempts:最大重試次數(shù),默認(rèn)是3次
- backoff:重試等待策略,默認(rèn)使用@Backoff,value為重試間隔,delay為重試之間的等待時間(毫秒為單位),multiplier指定延遲的倍數(shù)。
查看效果

可以看到,重試5次之后拋出異常,不再重試。
@Recover
當(dāng)重試耗盡完后還是失敗,會出現(xiàn)什么情況?
RetryOperations可以將控制傳遞給另一個回調(diào),即RecoveryCallback。Spring還提供了@Recover注解,用于@Retryable重試失敗后處理方法,此方法里的異常一定要是@Retryable方法里拋出的異常,否則不會回調(diào)這個方法。
@Recover
public void doRecover(Exception e) {
log.info("----------重試失敗回調(diào)方法----------");
log.info(e.getMessage());
}
@Recover注解需要注意的點(diǎn):
- 方法的返回值必須與@Retryable方法一致
- 方法的第一個參數(shù),必須是Throwable類型的,建議是與@Retryable配置的異常一致,其他的參數(shù),需要與@Retryable方法的參數(shù)一致。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring boot結(jié)合Redis實(shí)現(xiàn)工具類的方法示例
這篇文章主要介紹了spring boot結(jié)合Redis實(shí)現(xiàn)工具類的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例
這篇文章主要介紹了Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能,結(jié)合完整實(shí)例形式分析了java觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警的相關(guān)接口定義、使用、功能操作技巧,并總結(jié)了其設(shè)計原則與適用場合,具有一定參考借鑒價值,需要的朋友可以參考下2018-04-04
詳解SpringBoot 創(chuàng)建定時任務(wù)(配合數(shù)據(jù)庫動態(tài)執(zhí)行)
本篇文章主要介紹了SpringBoot 創(chuàng)建定時任務(wù)(配合數(shù)據(jù)庫動態(tài)執(zhí)行),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
SpringBoot+Mybatis-plus實(shí)現(xiàn)分頁查詢的示例代碼
本文主要介紹了SpringBoot+Mybatis-plus實(shí)現(xiàn)分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

