使用Spring?Retry實(shí)現(xiàn)業(yè)務(wù)異常重試
在系統(tǒng)中經(jīng)常遇到業(yè)務(wù)重試的邏輯,比如三方接口調(diào)用,timeout重試三遍,異常處理重試的兜底邏輯等。那你是不是還在用下面這種方式呢:

我想大家可能很多時候也會這么寫,這是能想到的第一個方法,但是我們這段代碼,會覺得很別扭,不夠優(yōu)雅,如果有多個重試的邏輯,就會顯得重復(fù)代碼太多,也不容易理解,總之在遇到Spring Retry之前我也一直在想有沒有更好的方法去解決這種問題。下面我們來看看Spring Retry如何實(shí)現(xiàn)的。
項(xiàng)目配置
添加依賴
<dependencies>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
啟用Spring Retry支持,添加**@EnableRetry**注解
@SpringBootApplication
@EnableRetry
public class Launcher {
public static void main(String[] args) {
SpringApplication.run(Launcher.class, args);
}
}
@Retryable 注解形式
注解方式就是在啟用重試特性的方法上使用@Retryable注釋。
public interface RetryService {
/**
* 指定異常CustomRetryException重試,重試最大次數(shù)為4(默認(rèn)是3),重試補(bǔ)償機(jī)制間隔200毫秒
* 還可以配置exclude,指定異常不充實(shí),默認(rèn)為空
* @return result
* @throws CustomRetryException 指定異常
*/
@Retryable(value = {CustomRetryException.class},maxAttempts = 4,backoff = @Backoff(200))
String retry() throws CustomRetryException;
}
- value屬性告訴 Spring retry 在方法在CustomRetryException異常出現(xiàn)時觸發(fā)重試。
- maxAttempts設(shè)置重試的最大次數(shù),如果沒有指定默認(rèn)值為3。
- backoff指定下次重試的延遲時間,默認(rèn)值為1秒。
@Recover注解使用
當(dāng)被@Retryable注解的方法由于指定的異常而失敗時,用于定義單獨(dú)恢復(fù)方法的@Recover注釋。
@Service
@Slf4j
public class RetryServiceImpl implements RetryService {
?
private static int count = 1;
?
@Override
public String retry() throws CustomRetryException {
log.info("retry{},throw CustomRetryException in method retry",count);
count ++;
throw new CustomRetryException("throw custom exception");
}
?
@Recover
public String recover(Throwable throwable) {
log.info("Default Retry service test");
return "Error Class :: " + throwable.getClass().getName();
}
?
}
RetryTemplate實(shí)現(xiàn)形式
@Bean
@ConditionalOnMissingBean
public RetryTemplate retryTemplate(){
final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
simpleRetryPolicy.setMaxAttempts(4);
?
final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000L);
?
return RetryTemplate.builder()
.customPolicy(simpleRetryPolicy)
.customBackoff(fixedBackOffPolicy)
.retryOn(CustomRetryException.class)
.build();
}
// 執(zhí)行部分
@Autowired
RetryTemplate retryTemplate;
template.execute(ctx -> {
return backendAdapter.getBackendResponse(...);
});
總結(jié)
那么哪些地方我們能用到Spring Retry呢?有這兩點(diǎn)建議
- 僅在臨時錯誤上使用重試。不建議它在永久錯誤中使用它,因?yàn)檫@樣可能導(dǎo)致系統(tǒng)性能問題。
- 它不是熔斷器的替代的一種方式,最好在允許的情況下,既使用熔斷器,又使用重試器。
到此這篇關(guān)于使用Spring Retry實(shí)現(xiàn)業(yè)務(wù)異常重試的文章就介紹到這了,更多相關(guān)Spring Retry業(yè)務(wù)異常重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用maven運(yùn)行Java Main的三種方法解析
這篇文章主要介紹了使用maven運(yùn)行Java Main的三種方式的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。2017-10-10
使用Swagger2實(shí)現(xiàn)自動生成RESTful?API文檔
在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動生成?RESTful?API?文檔,需要的可以參考一下2023-06-06
java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
通常都把隊(duì)列比喻成排隊(duì)買東西,大家都很守秩序,先排隊(duì)的人就先買東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列,感興趣的朋友一起看看吧2021-08-08
深入解析Java的Struts框架中的控制器DispatchAction
這篇文章主要介紹了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
spring boot微服務(wù)自定義starter原理詳解
這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
java.io.File的renameTo方法移動文件失敗的解決方案
這篇文章主要介紹了java.io.File的renameTo方法移動文件失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

