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