使用Spring?Retry實(shí)現(xiàn)業(yè)務(wù)異常重試
在系統(tǒng)中經(jīng)常遇到業(yè)務(wù)重試的邏輯,比如三方接口調(diào)用,timeout重試三遍,異常處理重試的兜底邏輯等。那你是不是還在用下面這種方式呢:
我想大家可能很多時(shí)候也會(huì)這么寫,這是能想到的第一個(gè)方法,但是我們這段代碼,會(huì)覺(jué)得很別扭,不夠優(yōu)雅,如果有多個(gè)重試的邏輯,就會(huì)顯得重復(fù)代碼太多,也不容易理解,總之在遇到Spring Retry之前我也一直在想有沒(méi)有更好的方法去解決這種問(wèn)題。下面我們來(lái)看看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)時(shí)觸發(fā)重試。
- maxAttempts設(shè)置重試的最大次數(shù),如果沒(méi)有指定默認(rèn)值為3。
- backoff指定下次重試的延遲時(shí)間,默認(rèn)值為1秒。
@Recover注解使用
當(dāng)被@Retryable注解的方法由于指定的異常而失敗時(shí),用于定義單獨(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)建議
- 僅在臨時(shí)錯(cuò)誤上使用重試。不建議它在永久錯(cuò)誤中使用它,因?yàn)檫@樣可能導(dǎo)致系統(tǒng)性能問(wèn)題。
- 它不是熔斷器的替代的一種方式,最好在允許的情況下,既使用熔斷器,又使用重試器。
到此這篇關(guān)于使用Spring Retry實(shí)現(xiàn)業(yè)務(wù)異常重試的文章就介紹到這了,更多相關(guān)Spring Retry業(yè)務(wù)異常重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
封裝了一個(gè)Java數(shù)據(jù)庫(kù)訪問(wèn)管理類
剛剛試著用JDBC,仿著原來(lái)C#的寫法寫了這段代碼,自己覺(jué)得還是挺粗糙的,還煩請(qǐng)路過(guò)的朋友推薦一個(gè)寫得較好較完整的相關(guān)例程以便學(xué)習(xí)。謝謝!2009-02-02使用maven運(yùn)行Java Main的三種方法解析
這篇文章主要介紹了使用maven運(yùn)行Java Main的三種方式的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10使用Swagger2實(shí)現(xiàn)自動(dòng)生成RESTful?API文檔
在開發(fā)?RESTful?API?的過(guò)程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動(dòng)生成?RESTful?API?文檔,需要的可以參考一下2023-06-06java數(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-12spring boot微服務(wù)自定義starter原理詳解
這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12淺談Springboot之于Spring的優(yōu)勢(shì)
這篇文章主要介紹了淺談Springboot之于Spring的優(yōu)勢(shì),簡(jiǎn)述了在Java EE開發(fā)中遇到的問(wèn)題,言簡(jiǎn)意賅,需要的朋友可以參考下。2017-09-09java.io.File的renameTo方法移動(dòng)文件失敗的解決方案
這篇文章主要介紹了java.io.File的renameTo方法移動(dòng)文件失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07