Spring Retry重試框架的使用講解
重試框架Spring-Retry是什么
Spring Retry是一個(gè)在Spring框架中以聲明方式重試操作的框架。 它提供了對(duì)Spring框架現(xiàn)有重試支持的擴(kuò)展,包括RetryTemplate和RetryOperations接口。 Spring Retry提供了幾個(gè)高級(jí)抽象,例如@Retryable、@Recover和RecoveryCallback,這些抽象允許您聲明性地指定應(yīng)該重試哪些方法以及如何處理重試失敗。 它還支持使用SpringRestTemplate重試HTTP請(qǐng)求。
Spring Retry在您希望在操作失敗時(shí)自動(dòng)重試的情況下非常有用,無論是由于暫時(shí)錯(cuò)誤還是更持久的失敗。 這在重試操作可能會(huì)成功的情況下非常有用,并且可以避免您在代碼中手動(dòng)實(shí)現(xiàn)重試邏輯。
Spring-Retry如何使用
SpringRetry是一個(gè)自動(dòng)重試失敗操作的框架。 它可用于自動(dòng)重試由于暫時(shí)錯(cuò)誤(如臨時(shí)網(wǎng)絡(luò)中斷、速率限制和HTTP 500錯(cuò)誤)而失敗的操作。
以下是如何使用Spring Retry自動(dòng)重試失敗操作的示例:
1、將SpringRetry依賴項(xiàng)添加到項(xiàng)目中。 例如,如果您正在使用Maven,可以將以下依賴項(xiàng)添加到pom.xml文件中:
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.5.RELEASE</version> </dependency>
2、用@Retryable注釋您的方法。 這會(huì)告訴Spring在方法失敗時(shí)自動(dòng)重試該方法。 您可以指定應(yīng)觸發(fā)重試的異常類型,以及嘗試的最大重試次數(shù)。 例如:
@Retryable(value = {ConnectException.class, SocketException.class}, maxAttempts = 3)
public void doSomething() throws Exception {
// code to execute
}
3、用@Recover注釋您的方法。 這告訴Spring如果所有重試都失敗了該怎么辦。 @Recover方法應(yīng)具有與@Retryable方法相同的簽名,并為導(dǎo)致失敗的異常添加一個(gè)附加參數(shù)。 例如:
@Recover
public void recover(ConnectException e) {
// code to execute if all retries fail
}
4、在應(yīng)用程序上下文中啟用Spring Retry。 您可以通過將@EnableRetry注釋添加到配置類中,或者通過將<retry:annotation-driven/>元素添加到XML配置中來實(shí)現(xiàn)這一點(diǎn)。
@EnableRetry
public class ErpApplication {
public static void main(String[] args) {
SpringApplication.run(ErpApplication.class, args);
}
}
就是這樣! 如果doSomething()方法因ConnectException或SocketException而失敗,Spring現(xiàn)在將自動(dòng)重試,最多重試3次。 如果所有重試都失敗,將調(diào)用recover()方法。
測(cè)試
service層
@Retryable(value = {NullPointerException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2))
public void retryableMethod() {
System.out.println("hello world");
throw new NullPointerException("空指針異常");
}
測(cè)試方法
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestRetry {
@Resource
private SalesServiceImpl salesServiceImpl;
@Test
public void test001() {
salesServiceImpl.retryableMethod();
}
}
運(yùn)行效果
hello world
hello world
hello world
java.lang.NullPointerException: 空指針異常
屬性說明
@Retryable 是一個(gè) Spring 注解,它可以在方法級(jí)別使用,用于聲明該方法是可以重試的。當(dāng)使用 @Retryable 注解標(biāo)注的方法拋出異常時(shí),Spring 會(huì)自動(dòng)重試該方法。這對(duì)于一些具有一定的不確定性的操作,例如遠(yuǎn)程調(diào)用或者使用外部系統(tǒng)時(shí)非常有用,因?yàn)檫@些操作很可能會(huì)失敗。
你可以使用 @Retryable 注解的 value 屬性指定應(yīng)該重試的異常類型,也可以使用 include 和 exclude 屬性來指定應(yīng)該重試的異常類型。你還可以使用 maxAttempts 屬性指定最大重試次數(shù),使用 backoff 屬性指定重試之間的間隔,使用 multiplier 屬性指定每次重試之間間隔時(shí)間的增長倍數(shù)。
例如,下面的代碼聲明了一個(gè)可以重試的方法,在方法拋出 ServiceUnavailableException 時(shí)會(huì)重試三次,重試之間的間隔是 1000 毫秒,每次重試之間的間隔會(huì)翻倍:
@Retryable(value = ServiceUnavailableException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2))
public void someMethod() {
// method implementation
}
重試全部失敗的回調(diào)方法
@Recover注解指定重試全部失敗的回調(diào)方法
@Retryable(value = {NullPointerException.class}, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2))
public void retryableMethod() {
System.out.println("hello world");
throw new NullPointerException("空指針異常");
}
@Recover
public void recover() {
System.out.println("重試全部失敗的回調(diào)方法");
}
測(cè)試結(jié)果
hello world
hello world
hello world
重試全部失敗的回調(diào)方法
到此這篇關(guān)于Spring Retry重試框架的使用講解的文章就介紹到這了,更多相關(guān)Spring Retry重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于spring@aspect注解的aop實(shí)現(xiàn)過程代碼實(shí)例
這篇文章主要介紹了基于spring@aspect注解的aop實(shí)現(xiàn)過程代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作
這篇文章主要介紹了springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作,本文給大家介紹項(xiàng)目場景及解決分析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Spring Boot右鍵maven build成功但是直接運(yùn)行main方法出錯(cuò)的解決方案
這篇文章主要介紹了Spring Boot-右鍵maven build成功但是直接運(yùn)行main方法出錯(cuò)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Spring?Boot和Vue前后端分離項(xiàng)目架構(gòu)的全過程
前后端分離是目前互聯(lián)網(wǎng)開發(fā)中比較廣泛使用的開發(fā)模式,主要是將前端和后端的項(xiàng)目業(yè)務(wù)進(jìn)行分離,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot和Vue前后端分離項(xiàng)目架構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-04-04
springboot Quartz動(dòng)態(tài)修改cron表達(dá)式的方法
這篇文章主要介紹了springboot Quartz動(dòng)態(tài)修改cron表達(dá)式的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
openGauss數(shù)據(jù)庫JDBC環(huán)境連接配置的詳細(xì)過程(Eclipse)
這篇文章主要介紹了openGauss數(shù)據(jù)庫JDBC環(huán)境連接配置(Eclipse),演示基于JDBC開發(fā)的主要步驟,會(huì)涉及創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表、插入數(shù)據(jù)等,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
feign 調(diào)用第三方服務(wù)中部分特殊符號(hào)未轉(zhuǎn)義問題
這篇文章主要介紹了feign 調(diào)用第三方服務(wù)中部分特殊符號(hào)未轉(zhuǎn)義問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

