日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring框架中一個有用的小組件之Spring Retry組件詳解

瀏覽:46日期:2023-06-30 09:02:33
1、概述

Spring Retry 是Spring框架中的一個組件,它提供了自動重新調用失敗操作的能力。這在錯誤可能是暫時發生的(如瞬時網絡故障)的情況下很有幫助。

在本文中,我們將看到使用Spring Retry的各種方式:注解、RetryTemplate以及回調。

2、Maven依賴

讓我們首先將spring-retry依賴項添加到我們的pom.xml文件中:

<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.5.RELEASE</version></dependency>

我們還需要將Spring AOP添加到我們的項目中:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.8.RELEASE</version></dependency>

可以查看Maven Central來獲取最新版本的spring-retry和spring-aspects 依賴項。

3、開啟Spring Retry

要在應用程序中啟用Spring Retry,我們需要將@EnableRetry注釋添加到我們的@Configuration類:

@Configuration@EnableRetrypublic class AppConfig { ... }4、使用Spring Retry

4.1、@Retryable而不用恢復

我們可以使用@Retryable注解為方法添加重試功能:

@Servicepublic interface MyService { @Retryable(value = RuntimeException.class) void retryService(String sql);}

在這里,當拋出RuntimeException時嘗試重試。

根據@Retryable的默認行為,重試最多可能發生3次,重試之間有1秒的延遲。

4.2、@Retryable和@Recover

現在讓我們使用@Recover注解添加一個恢復方法:

@Servicepublic interface MyService { @Retryable(value = SQLException.class) void retryServiceWithRecovery(String sql) throws SQLException; @Recover void recover(SQLException e, String sql);}

這里,當拋出SQLException時重試會嘗試運行。 當@Retryable方法因指定異常而失敗時,@Recover注解定義了一個單獨的恢復方法。

因此,如果retryServiceWithRecovery方法在三次嘗試之后還是拋出了SQLException,那么recover()方法將被調用。

恢復處理程序的第一個參數應該是Throwable類型(可選)和相同的返回類型。其余的參數按相同順序從失敗方法的參數列表中填充。

4.3、自定義@Retryable的行為

為了自定義重試的行為,我們可以使用參數maxAttempts和backoff:

@Servicepublic interface MyService { @Retryable( value = SQLException.class, maxAttempts = 2, backoff = @Backoff(delay = 100)) void retryServiceWithCustomization(String sql) throws SQLException;}

這樣最多將有兩次嘗試和100毫秒的延遲。

4.4、使用Spring Properties

我們還可以在@Retryable注解中使用properties。

為了演示這一點,我們將看到如何將delay和maxAttempts的值外部化到一個properties文件中。

首先,讓我們在名為retryConfig.properties的文件中定義屬性:

retry.maxAttempts=2retry.maxDelay=100

然后我們指示@Configuration類加載這個文件:

@PropertySource('classpath:retryConfig.properties')public class AppConfig { ... }// ...

最后,我們可以在@Retryable的定義中注入retry.maxAttempts和retry.maxDelay的值:

@Service public interface MyService { @Retryable( value = SQLException.class, maxAttemptsExpression = '${retry.maxAttempts}', backoff = @Backoff(delayExpression = '${retry.maxDelay}')) void retryServiceWithExternalizedConfiguration(String sql) throws SQLException; }

請注意,我們現在使用的是maxAttemptsExpression和delayExpression而不是maxAttempts和delay。

5、RetryTemplate

5.1、RetryOperations

Spring Retry提供了RetryOperations接口,它提供了一組execute()方法:

public interface RetryOperations { <T> T execute(RetryCallback<T> retryCallback) throws Exception; ...}

execute()方法的參數RetryCallback,是一個接口,可以插入需要在失敗時重試的業務邏輯:

public interface RetryCallback<T> { T doWithRetry(RetryContext context) throws Throwable;}

5.2、RetryTemplate配置

RetryTemplate是RetryOperations的一個實現。

讓我們在@Configuration類中配置一個RetryTemplate的bean:

@Configurationpublic class AppConfig { //... @Bean public RetryTemplate retryTemplate() {RetryTemplate retryTemplate = new RetryTemplate();FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();fixedBackOffPolicy.setBackOffPeriod(2000l);retryTemplate.setBackOffPolicy(fixedBackOffPolicy);SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();retryPolicy.setMaxAttempts(2);retryTemplate.setRetryPolicy(retryPolicy);return retryTemplate; }}

這個RetryPolicy確定了何時應該重試操作。

其中SimpleRetryPolicy定義了重試的固定次數,另一方面,BackOffPolicy用于控制重試嘗試之間的回退。

最后,FixedBackOffPolicy會使重試在繼續之前暫停一段固定的時間。

5.3、使用RetryTemplate

要使用重試處理來運行代碼,我們可以調用retryTemplate.execute()方法:

retryTemplate.execute(new RetryCallback<Void, RuntimeException>() { @Override public Void doWithRetry(RetryContext arg0) {myService.templateRetryService();... }});

我們可以使用lambda表達式代替匿名類:

retryTemplate.execute(arg0 -> { myService.templateRetryService(); return null;});6、監聽器

監聽器在重試時提供另外的回調。我們可以用這些來關注跨不同重試的各個橫切點。

6.1、添加回調

回調在RetryListener接口中提供:

public class DefaultListenerSupport extends RetryListenerSupport { @Override public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {logger.info('onClose');...super.close(context, callback, throwable); } @Override public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {logger.info('onError'); ...super.onError(context, callback, throwable); } @Override public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {logger.info('onOpen');...return super.open(context, callback); }}

open和close的回調在整個重試之前和之后執行,而onError應用于單個RetryCallback調用。

6.2、注冊監聽器

接下來,我們將我們的監聽器(DefaultListenerSupport)注冊到我們的RetryTemplate bean:

@Configurationpublic class AppConfig { ... @Bean public RetryTemplate retryTemplate() {RetryTemplate retryTemplate = new RetryTemplate();...retryTemplate.registerListener(new DefaultListenerSupport());return retryTemplate; }}7、測試結果

為了完成我們的示例,讓我們驗證一下結果:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration( classes = AppConfig.class, loader = AnnotationConfigContextLoader.class)public class SpringRetryIntegrationTest { @Autowired private MyService myService; @Autowired private RetryTemplate retryTemplate; @Test(expected = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry() {retryTemplate.execute(arg0 -> { myService.templateRetryService(); return null;}); }}

從測試日志中可以看出,我們已經正確配置了RetryTemplate和RetryListener:

2020-01-09 20:04:10 [main] INFO c.p.s.DefaultListenerSupport - onOpen 2020-01-09 20:04:10 [main] INFO c.pinmost.springretry.MyServiceImpl - throw RuntimeException in method templateRetryService() 2020-01-09 20:04:10 [main] INFO c.p.s.DefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO c.pinmost.springretry.MyServiceImpl - throw RuntimeException in method templateRetryService() 2020-01-09 20:04:12 [main] INFO c.p.s.DefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO c.p.s.DefaultListenerSupport - onClose

8、結論

在本文中,我們看到了如何使用注解、RetryTemplate和回調監聽器來使用Spring Retry。

原文地址:https://www.baeldung.com/spring-retry

到此這篇關于Spring框架中一個有用的小組件:Spring Retry的文章就介紹到這了,更多相關Spring Spring Retry組件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美亚洲一级| 粉嫩av一区二区三区四区五区| 久久97视频| 国产精品成人自拍| 国产成人77亚洲精品www| 国产粉嫩在线观看| 成人日韩av| 蜜桃精品在线| 国产午夜精品一区二区三区欧美 | 老司机免费视频一区二区三区| 欧美午夜三级| 鲁大师精品99久久久| 波多视频一区| 国产毛片一区| 亚洲+小说+欧美+激情+另类| 国产精品色在线网站| 精品国产欧美日韩一区二区三区| 92国产精品| 99成人在线| 久久精品72免费观看| 国产精品任我爽爆在线播放 | 999久久久国产精品| 国产亚洲激情| 国产精品一卡| 欧美gv在线| 亚洲欧美网站| 久久99精品久久久野外观看| 久久一级电影| 欧美在线不卡| 99久久99久久精品国产片果冰| 亚洲毛片在线免费| 国产精品成人3p一区二区三区| 日本不良网站在线观看| 蜜臀av在线播放一区二区三区| 国产欧美自拍| 亚洲性色视频| 国产美女视频一区二区| 99精品视频精品精品视频| 亚洲精品乱码久久久久久蜜桃麻豆| 国内一区二区三区| 久久电影一区| 成人在线免费观看91| 视频在线观看国产精品| 国产精品tv| 老牛影视一区二区三区| 国产一区二区三区四区二区| 激情久久五月| 国产精品极品| 黄页网站一区| 欧美91在线| 丝袜美腿成人在线| 福利一区在线| 欧美日韩99| 亚洲在线一区| 免费在线小视频| 欧美一区影院| 日本欧洲一区二区| 国产中文在线播放| 奇米狠狠一区二区三区| 在线成人动漫av| 精品国产一区二区三区av片| 亚洲综合精品| 日韩精品首页| 激情久久一区二区| 欧美日本不卡高清| 一区在线免费观看| 最新中文字幕在线播放| 欧美一级网站| 蜜臀久久99精品久久久画质超高清 | 国产成年精品| 日韩中文av| 九一成人免费视频| 伊人久久在线| 久久97视频| 久久av偷拍| 日本成人中文字幕| 男女男精品网站| 激情综合自拍| 久久国产小视频| 欧美日韩国产观看视频| 麻豆视频久久| 国产精品自拍区| 亚洲影视一区二区三区| 欧美精品激情| 国产专区一区| 欧美天堂视频| 国产精品蜜芽在线观看| 国产精品对白| 国产精品巨作av| 欧美亚洲福利| 久久黄色影视| 久久av免费| 久久影院资源站| 久久伊人久久| а√天堂8资源中文在线| 大香伊人久久精品一区二区| 97精品国产| 999视频精品| 亚洲午夜91| 日韩天堂av| 欧美在线亚洲综合一区| 午夜欧美精品| 蜜桃久久久久久| 国产精品日本一区二区不卡视频 | 亚洲三级毛片| 日韩精品91亚洲二区在线观看| 日韩一区二区三免费高清在线观看| 亚洲精品无播放器在线播放| 欧美精品影院| 精品视频自拍| 日韩三区在线| 一级欧洲+日本+国产| 亚洲一区免费| 亚洲天堂免费| 91精品国产自产精品男人的天堂| 国产亚洲一区| 麻豆免费精品视频| 日韩欧美另类一区二区| 女同性一区二区三区人了人一 | 国产精品色网| 日韩视频一二区| 久久精品国产99国产精品| 丁香婷婷久久| 欧美va亚洲va日韩∨a综合色| 蜜臀a∨国产成人精品| 国产精品调教视频| 日韩一区三区| 国产精品毛片在线| 亚洲97av| 国产伦久视频在线观看| 日韩一级精品| 国产精品一页| 亚洲成人一区在线观看| 亚洲欧洲另类| 国产欧美激情| 婷婷精品视频| 日韩成人午夜精品| 日韩1区2区3区| 久久男人av资源站| 喷白浆一区二区| 久久久久久网| 天堂av在线一区| 日韩av一区二区在线影视| 精品国产一区二区三区2021| 午夜日韩av| 国产激情久久| 国产伊人精品| 91p九色成人| 激情黄产视频在线免费观看| 日韩精品一级中文字幕精品视频免费观看 | 免费成人性网站| 国产成人在线中文字幕| 国产视频一区欧美| 精品美女久久| 亚洲精品高潮| 欧美日一区二区| 国产精品片aa在线观看| 亚洲精品1区| 91一区二区| 青青伊人久久| 五月综合激情| 福利视频一区| 日韩超碰人人爽人人做人人添| 欧美成a人免费观看久久| 三级一区在线视频先锋| 国产精品二区不卡| 无码日韩精品一区二区免费| 欧美成人基地 | 国产精品视区| av日韩中文| 国产精品久久久久久模特| 国产一区二区三区自拍| 国产精品日本一区二区不卡视频 | 日本一区二区三区中文字幕| 欧美日韩国产免费观看视频| 91久久久精品国产| 亚洲天堂av影院| 欧美精品1区| 日本va欧美va瓶| 天使萌一区二区三区免费观看| 99精品美女| 国精品产品一区| 国产精品视频首页| 91免费精品国偷自产在线在线| 国产美女一区| 亚洲国产不卡| 亲子伦视频一区二区三区| 久久这里只有精品一区二区| 欧美一区激情| 日韩国产在线一| 亚洲区欧美区| 亚洲一区av| 久久国产精品毛片| 欧美日韩国产传媒| 91精品国产自产在线观看永久∴| 国产一区二区三区网| 91精品国产一区二区在线观看| 亚洲伊人影院| 免费在线观看视频一区| 欧美福利一区|