SpringBoot @Retryable注解使用
前言
在使用第三方接口的時候,一般都會有一些類似登錄客戶端的處理,或者發(fā)送消息這些場景,有時候會出現(xiàn)網絡抖動、連接超時等異常,這時候就需要進行多次重試。
一般如果我們自己實現(xiàn)重試機制,都是使用循環(huán),但是這樣并不優(yōu)雅。
在SpringBoot中已經提供了實現(xiàn)重試機制的功能——@Retryable注解,可以在不侵入原有邏輯代碼的方式下,優(yōu)雅的實現(xiàn)重處理功能。
一、@Retryable是什么?
@Retryable是Spring提供的可重試注解,該注解一般用于方法上,實現(xiàn)方法的重試機制。
二、使用步驟
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,開啟重試機制。
@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一樣,默認為空,當exclude也為空時,默認所有異常
- exclude:指定不處理的異常
- maxAttempts:最大重試次數(shù),默認是3次
- backoff:重試等待策略,默認使用@Backoff,value為重試間隔,delay為重試之間的等待時間(毫秒為單位),multiplier指定延遲的倍數(shù)。
查看效果
可以看到,重試5次之后拋出異常,不再重試。
@Recover
當重試耗盡完后還是失敗,會出現(xiàn)什么情況?
RetryOperations可以將控制傳遞給另一個回調,即RecoveryCallback。Spring還提供了@Recover注解,用于@Retryable重試失敗后處理方法,此方法里的異常一定要是@Retryable方法里拋出的異常,否則不會回調這個方法。
@Recover public void doRecover(Exception e) { log.info("----------重試失敗回調方法----------"); log.info(e.getMessage()); }
@Recover注解需要注意的點:
- 方法的返回值必須與@Retryable方法一致
- 方法的第一個參數(shù),必須是Throwable類型的,建議是與@Retryable配置的異常一致,其他的參數(shù),需要與@Retryable方法的參數(shù)一致。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決Springboot2.1.x配置Activiti7單獨數(shù)據源問題
這篇文章主要介紹了Springboot2.1.x配置Activiti7單獨數(shù)據源問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09Java?SSM實現(xiàn)前后端協(xié)議聯(lián)調詳解下篇
首先我們已經知道,在現(xiàn)在流行的“前后端完全分離”架構中,前后端聯(lián)調是一個不可能避免的問題,這篇文章主要介紹了Java?SSM實現(xiàn)前后端協(xié)議聯(lián)調過程2022-08-08Java面試重點中的重點之Elasticsearch核心原理
ElasticSearch是一個基于Lucene的搜索引擎,是用Java語言開發(fā)的,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便,作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,是最受歡迎的企業(yè)搜索引擎2022-01-01