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)文章
解決Springboot2.1.x配置Activiti7單獨(dú)數(shù)據(jù)源問題
這篇文章主要介紹了Springboot2.1.x配置Activiti7單獨(dú)數(shù)據(jù)源問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09Java?SSM實(shí)現(xiàn)前后端協(xié)議聯(lián)調(diào)詳解下篇
首先我們已經(jīng)知道,在現(xiàn)在流行的“前后端完全分離”架構(gòu)中,前后端聯(lián)調(diào)是一個不可能避免的問題,這篇文章主要介紹了Java?SSM實(shí)現(xiàn)前后端協(xié)議聯(lián)調(diào)過程2022-08-08Java面試重點(diǎn)中的重點(diǎn)之Elasticsearch核心原理
ElasticSearch是一個基于Lucene的搜索引擎,是用Java語言開發(fā)的,能夠達(dá)到實(shí)時搜索,穩(wěn)定,可靠,快速,安裝使用方便,作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,是最受歡迎的企業(yè)搜索引擎2022-01-01Json字符串轉(zhuǎn)Java對象和List代碼實(shí)例
這篇文章主要介紹了Json字符串轉(zhuǎn)Java對象和List代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06