Spring-retry實現(xiàn)循環(huán)重試功能
引言
在實際的應(yīng)用場景中,可能經(jīng)常會遇到,當(dāng)請求一個接口調(diào)一個服務(wù)的時候,出現(xiàn)異?;蚓W(wǎng)絡(luò)出現(xiàn)故障的情況下就會失敗,而對于那些重要的服務(wù)當(dāng)失敗后,可能我們就會進行重試,多調(diào)用幾次,如果還是失敗再另外進行單獨處理。接下來,就是要講解的重點內(nèi)容,我們可以通過@Retryable注解,優(yōu)雅的實現(xiàn)循環(huán)重試功能。
1:引入依賴
<!-- spring-retry -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>2:在啟動類上開啟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;
/**
* 需要在啟動類中添加@EnableRetry注釋以開啟重試功能,最后在相應(yīng)的方法上添加@Retryable注解。
* @Recover注解,重試完成之后執(zhí)行的回調(diào)方法
* 重試機制,如果調(diào)用方法過程中觸發(fā)了RuntimeException異常,則20秒后重試一次,最多重試3次,三次重試后會觸發(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的時候,就好觸發(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)聽,同時還是對重試方法進行了監(jiān)聽,如我們在方法retry上,加了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)聽到重試過程錯誤了");
}
@Override
public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
log.info("=======================================================================");
log.info("監(jiān)聽到重試過程開啟了");
return true;
}
}7:運行結(jié)果

到此這篇關(guān)于Spring-retry 優(yōu)雅的實現(xiàn)循環(huán)重試功能的文章就介紹到這了,更多相關(guān)Spring-retry循環(huán)重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java畢業(yè)設(shè)計實戰(zhàn)之健身俱樂部管理系統(tǒng)的實現(xiàn)
這是一個使用了java+SSM+Mysql+Jsp開發(fā)的健身俱樂部管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有俱樂部管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法
本篇文章主要介紹了詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
Springboot集成SSE實現(xiàn)單工通信消息推送流程詳解
SSE簡單的來說就是服務(wù)器主動向前端推送數(shù)據(jù)的一種技術(shù),它是單向的,也就是說前端是不能向服務(wù)器發(fā)送數(shù)據(jù)的。SSE適用于消息推送,監(jiān)控等只需要服務(wù)器推送數(shù)據(jù)的場景中,下面是使用Spring Boot來實現(xiàn)一個簡單的模擬向前端推動進度數(shù)據(jù),前端頁面接受后展示進度條2022-11-11
史上最全最強SpringMVC詳細(xì)示例實戰(zhàn)教程(圖文)
這篇文章主要介紹了史上最全最強SpringMVC詳細(xì)示例實戰(zhàn)教程(圖文),需要的朋友可以參考下2016-12-12

