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ǎ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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java ReentrantLock的使用與應(yīng)用實(shí)戰(zhàn)
ReentrantLock是Java并發(fā)包中提供的一種可重入互斥鎖,它作為synchronized關(guān)鍵字的替代方案,提供了更靈活、更強(qiáng)大的線程同步機(jī)制,下面就來(lái)介紹一下ReentrantLock的實(shí)戰(zhàn)使用2025-09-09
springboot用thymeleaf模板的paginate分頁(yè)完整代碼
本文根據(jù)一個(gè)簡(jiǎn)單的user表為例,展示 springboot集成mybatis,再到前端分頁(yè)完整代碼,需要的朋友可以參考下2017-07-07
struts2通過(guò)action返回json對(duì)象
struts2通過(guò)action返回json對(duì)象其實(shí)很簡(jiǎn)單的,首先我們需要引入jar包,然后在寫(xiě)一個(gè)簡(jiǎn)單的action就好了,接下來(lái)通過(guò)本文給大家介紹struts2通過(guò)action返回json對(duì)象的方法,感興趣的朋友一起看看吧2016-09-09
MyBatis查詢時(shí)屬性名和字段名不一致問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于MyBatis查詢時(shí)屬性名和字段名不一致問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java設(shè)計(jì)模式之工廠方法模式實(shí)例簡(jiǎn)析
這篇文章主要介紹了Java設(shè)計(jì)模式之工廠方法模式,較為詳細(xì)的分析了Java工廠模式的功能、定義并給出了實(shí)例代碼加以總結(jié)分析,需要的朋友可以參考下2015-11-11
RestTemplate如何使用JSON發(fā)送Post請(qǐng)求
這篇文章主要介紹了RestTemplate如何使用JSON發(fā)送Post請(qǐng)求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

