使用Spring?Retry實現(xiàn)業(yè)務(wù)異常重試
在系統(tǒng)中經(jīng)常遇到業(yè)務(wù)重試的邏輯,比如三方接口調(diào)用,timeout重試三遍,異常處理重試的兜底邏輯等。那你是不是還在用下面這種方式呢:
我想大家可能很多時候也會這么寫,這是能想到的第一個方法,但是我們這段代碼,會覺得很別扭,不夠優(yōu)雅,如果有多個重試的邏輯,就會顯得重復(fù)代碼太多,也不容易理解,總之在遇到Spring Retry之前我也一直在想有沒有更好的方法去解決這種問題。下面我們來看看Spring Retry如何實現(xiàn)的。
項目配置
添加依賴
<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(默認是3),重試補償機制間隔200毫秒 * 還可以配置exclude,指定異常不充實,默認為空 * @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ù),如果沒有指定默認值為3。
- backoff指定下次重試的延遲時間,默認值為1秒。
@Recover注解使用
當被@Retryable注解的方法由于指定的異常而失敗時,用于定義單獨恢復(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實現(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呢?有這兩點建議
- 僅在臨時錯誤上使用重試。不建議它在永久錯誤中使用它,因為這樣可能導(dǎo)致系統(tǒng)性能問題。
- 它不是熔斷器的替代的一種方式,最好在允許的情況下,既使用熔斷器,又使用重試器。
到此這篇關(guān)于使用Spring Retry實現(xiàn)業(yè)務(wù)異常重試的文章就介紹到這了,更多相關(guān)Spring Retry業(yè)務(wù)異常重試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Swagger2實現(xiàn)自動生成RESTful?API文檔
在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實現(xiàn)自動生成?RESTful?API?文檔,需要的可以參考一下2023-06-06java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列
通常都把隊列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優(yōu)先隊列有所不同,它不遵循先進先出的規(guī)則,而是根據(jù)隊列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)-堆實現(xiàn)優(yōu)先隊列,感興趣的朋友一起看看吧2021-08-08深入解析Java的Struts框架中的控制器DispatchAction
這篇文章主要介紹了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12spring boot微服務(wù)自定義starter原理詳解
這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12java.io.File的renameTo方法移動文件失敗的解決方案
這篇文章主要介紹了java.io.File的renameTo方法移動文件失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07