Spring-retry實(shí)現(xiàn)循環(huán)重試功能
引言
在實(shí)際的應(yī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ú)處理。接下來,就是要講解的重點(diǎn)內(nèi)容,我們可以通過@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)類上開啟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注釋以開啟重試功能,最后在相應(yīng)的方法上添加@Retryable注解。
* @Recover注解,重試完成之后執(zhí)行的回調(diào)方法
* 重試機(jī)制,如果調(diào)用方法過程中觸發(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("有異常哦,我再試多幾次看下還有沒異常, 重試第{}次, {},{},{}",retryCount, orderNo,chassisNo,carStatus);
retryCount ++;
throw new RuntimeException("調(diào)用失敗!");
}
}
}當(dāng)程序出現(xiàn)RuntimeException的時(shí)候,就好觸發(fā)重試
5:recover方法,上邊定義了maxAttempts 為3,也就是說,重試三次后,如果還失敗了,則調(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)聽,同時(shí)還是對(duì)重試方法進(jìn)行了監(jiān)聽,如我們?cè)诜椒╮etry上,加了listeners 監(jiān)聽
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)聽到重試過程關(guān)閉了");
log.info("=======================================================================");
}
@Override
public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
log.info("監(jiān)聽到重試過程錯(cuò)誤了");
}
@Override
public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
log.info("=======================================================================");
log.info("監(jiān)聽到重試過程開啟了");
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畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之健身俱樂部管理系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+SSM+Mysql+Jsp開發(fā)的健身俱樂部管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有俱樂部管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法
本篇文章主要介紹了詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Springboot集成SSE實(shí)現(xiàn)單工通信消息推送流程詳解
SSE簡單的來說就是服務(wù)器主動(dòng)向前端推送數(shù)據(jù)的一種技術(shù),它是單向的,也就是說前端是不能向服務(wù)器發(fā)送數(shù)據(jù)的。SSE適用于消息推送,監(jiān)控等只需要服務(wù)器推送數(shù)據(jù)的場景中,下面是使用Spring Boot來實(shí)現(xiàn)一個(gè)簡單的模擬向前端推動(dòng)進(jìn)度數(shù)據(jù),前端頁面接受后展示進(jìn)度條2022-11-11
java實(shí)現(xiàn)json字符串格式化處理的工具類
這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)json字符串格式化處理的工具類,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文)
這篇文章主要介紹了史上最全最強(qiáng)SpringMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文),需要的朋友可以參考下2016-12-12

