Spring-retry實(shí)現(xiàn)循環(huán)重試功能
引言
在實(shí)際的應(yīng)用場(chǎng)景中,可能經(jīng)常會(huì)遇到,當(dāng)請(qǐng)求一個(gè)接口調(diào)一個(gè)服務(wù)的時(shí)候,出現(xiàn)異?;蚓W(wǎng)絡(luò)出現(xiàn)故障的情況下就會(huì)失敗,而對(duì)于那些重要的服務(wù)當(dāng)失敗后,可能我們就會(huì)進(jìn)行重試,多調(diào)用幾次,如果還是失敗再另外進(jìn)行單獨(dú)處理。接下來(lái),就是要講解的重點(diǎn)內(nèi)容,我們可以通過(guò)@Retryable注解,優(yōu)雅的實(shí)現(xiàn)循環(huán)重試功能。
1:引入依賴
<!-- spring-retry --> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
2:在啟動(dòng)類上開(kāi)啟retry重試功能
package com.patent.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.retry.annotation.EnableRetry; @SpringBootApplication @EnableRetry public class PatenCloudApplication { public static void main(String[] args) { SpringApplication.run(PatenCloudApplication.class, args); } }
3:業(yè)務(wù)處理,在要調(diào)用的方法上加上@Retryable注解
@Autowired private VehicleLocationDataService vehicleLocationDataService; /** * 需要在啟動(dòng)類中添加@EnableRetry注釋以開(kāi)啟重試功能,最后在相應(yīng)的方法上添加@Retryable注解。 * @Recover注解,重試完成之后執(zhí)行的回調(diào)方法 * 重試機(jī)制,如果調(diào)用方法過(guò)程中觸發(fā)了RuntimeException異常,則20秒后重試一次,最多重試3次,三次重試后會(huì)觸發(fā)recover方法 * @param orderNo * @param chassisNo * @param carStatus */ @GetMapping("/retryMyTest") @Retryable(value = RuntimeException.class,maxAttempts = 3, backoff = @Backoff(value = 10000L), recover = "recover", listeners = {"myRetryListener"}) public void retry(String orderNo, String chassisNo, String carStatus) throws RuntimeException { vehicleLocationDataService.retryMyTest(orderNo,chassisNo,carStatus); }
4:retryMyTest方法的邏輯處理
package com.patent.cloud.retry; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Slf4j @Service public class VehicleLocationDataService { public static Integer retryCount = 1; public void retryMyTest(String orderNo, String chassisNo, String carStatus){ boolean flag = false; if("P8012985".equals(chassisNo)){ flag = true; } if(retryCount==4){ retryCount =1; } if(!flag){ log.info("有異常哦,我再試多幾次看下還有沒(méi)異常, 重試第{}次, {},{},{}",retryCount, orderNo,chassisNo,carStatus); retryCount ++; throw new RuntimeException("調(diào)用失敗!"); } } }
當(dāng)程序出現(xiàn)RuntimeException的時(shí)候,就好觸發(fā)重試
5:recover方法,上邊定義了maxAttempts 為3,也就是說(shuō),重試三次后,如果還失敗了,則調(diào)用recover方法,需要在方法上標(biāo)注@Recover注解
@Recover public void recover(RuntimeException runtimeException,String orderNo, String chassisNo, String carStatus) { log.info("=======觸發(fā)重試了recover方法======{}==={}=={}===",orderNo,chassisNo,carStatus); }
6:監(jiān)聽(tīng),同時(shí)還是對(duì)重試方法進(jìn)行了監(jiān)聽(tīng),如我們?cè)诜椒╮etry上,加了listeners 監(jiān)聽(tīng)
package com.patent.cloud.retry; import lombok.extern.slf4j.Slf4j; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; import org.springframework.retry.listener.RetryListenerSupport; import org.springframework.stereotype.Service; @Slf4j @Service public class MyRetryListener extends RetryListenerSupport { @Override public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) { log.info("監(jiān)聽(tīng)到重試過(guò)程關(guān)閉了"); log.info("======================================================================="); } @Override public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) { log.info("監(jiān)聽(tīng)到重試過(guò)程錯(cuò)誤了"); } @Override public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) { log.info("======================================================================="); log.info("監(jiān)聽(tīng)到重試過(guò)程開(kāi)啟了"); return true; } }
7:運(yùn)行結(jié)果
到此這篇關(guān)于Spring-retry 優(yōu)雅的實(shí)現(xiàn)循環(huán)重試功能的文章就介紹到這了,更多相關(guān)Spring-retry循環(huán)重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用spring retry重試機(jī)制的操作詳解
- Java中使用Spring Retry實(shí)現(xiàn)重試機(jī)制的流程步驟
- spring @retryable不生效的一種場(chǎng)景分析
- 重試框架Guava-Retry和spring-Retry的使用示例
- Spring-Retry(重試機(jī)制)解讀
- SpringBoot中使用spring-retry 解決失敗重試調(diào)用
- spring-retry組件的使用教程
- Spring @Retryable注解輕松搞定循環(huán)重試功能
- Spring?Retry?實(shí)現(xiàn)樂(lè)觀鎖重試實(shí)踐記錄
相關(guān)文章
java compare compareTo方法區(qū)別詳解
本文主要介紹了java compare compareTo方法區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09詳解eclipse項(xiàng)目中的.classpath文件原理
這篇文章介紹了eclipse項(xiàng)目中的.classpath文件的原理,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解
在日常的接口開(kāi)發(fā)中,為了防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,經(jīng)常需要對(duì)接口的參數(shù)進(jìn)行校驗(yàn)。本文通過(guò)示例詳細(xì)講解了SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的,感興趣的可以學(xué)習(xí)一下2022-04-04Java實(shí)現(xiàn)的圖片上傳工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖片上傳工具類,涉及java針對(duì)圖片文件的檢查、上傳、清除等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Spring?Framework六種常見(jiàn)設(shè)計(jì)模式
設(shè)計(jì)模式是軟件開(kāi)發(fā)的重要組成部分,本文借助spring來(lái)講解這個(gè)框架的設(shè)計(jì)模式,通過(guò)本文我們探討了spring如何利用這些模式來(lái)提供這些豐富的功能,對(duì)本文感興趣的朋友跟隨小編一起看看吧2023-06-06