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

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

spring Retryable注解實現重試詳解

瀏覽:218日期:2023-08-13 13:31:21

spring-boot:1.5.3.RELEASE,spring-retry-1.2.0.RELEASE

使用方法

引入pom

// 版本號繼承spring-boot依賴管理的pom<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId></dependency>

啟用重試

@Configuration@ImportResource(locations = { 'classpath*:spring/app-context-*' })@EnableRetrypublic class AppContext {}

注解需要重試的方法

@Retryable(value = RuntimeException.class, maxAttempts = 3,backoff = @Backoff(delay = 10L, multiplier = 1))public boolean myRetryableMethod(){ ...}

注解屬性含義

Retryable

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Retryable { /** * 為重試方法應用重試攔截器的bean名稱。與其他屬性互斥 */ String interceptor() default ''; /** * 可以重試的異常類型。與includes屬性同義。默認值為空(并且如果exclude也是空的話, * 所有的異常都會重試) */ Class<? extends Throwable>[] value() default {}; /** * 同上 */ Class<? extends Throwable>[] include() default {}; /** * 與include含義相反 */ Class<? extends Throwable>[] exclude() default {}; /** * 統計報告的唯一標簽。如果沒有提供,調用者可以選擇忽略它,或者提供一個默認值。 * * @return the label for the statistics */ String label() default ''; /** * 標識重試有狀態的:即異常重新拋出,但是重試策略使用相同的策略應用于后續的具有相同參數的 * 調用。如果為false那么可重試的異常不會重新拋出。 */ boolean stateful() default false; /** * 嘗試的最大次數(包含第一次失敗),默認為3 */ int maxAttempts() default 3; /** * 返回一個求嘗試最大次數值的表達式(包含第一次失敗),默認為3 * 重寫 {@link #maxAttempts()}。 * @since 1.2 */ String maxAttemptsExpression() default ''; /** * 為正重試的動作指定backoff屬性。默認沒有backoff,但是在兩次嘗試之間暫定一下是一個很好的想法 * (即使代價是阻塞線程) */ Backoff backoff() default @Backoff(); /** * 在{@code SimpleRetryPolicy.canRetry()}返回true之后指定一個計算表達式 - 可用來有條件的取消重試。 * 僅在調用拋出一個異常后。求值的root對象為上一次的異常 {@code Throwable}。 * 可以引用上下文中的其他beans。 * 例如: * {@code 'message.contains(’you can retry this’)'}. * and * {@code '@someBean.shouldRetry(#root)'}. * @since 1.2 */ String exceptionExpression() default '';}

Backoff

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Import(RetryConfiguration.class)@Documentedpublic @interface Backoff { /** * 與 {@link #delay()} 屬性同義 * * 返回延遲多少毫秒后重試(默認為1000毫秒) */ long value() default 1000; /** * 一個標準的再重試周期。在指數函數情況下用作初始值,在始終如一的情況下(固定周期值情況) * 用作最小值。 * @return the initial or canonical backoff period in milliseconds (default 1000)??? */ long delay() default 0; /** * 重試之間最大等待(毫秒)時間。如果小于 {@link #delay()} 則忽略。 * @return the maximum delay between retries (default 0 = ignored) */ long maxDelay() default 0; /** * 如果是正數,則用于生成下次再重試等待時間的乘數。 * 返回一個乘數用于計算下次再重試延遲(默認為0忽略) */ double multiplier() default 0; /** * 標準再重試周期求值表達式。在指數情況下用作初始值,始終如一的情況下用作最小值。 * 重寫 {@link #delay()}. * @since 1.2 */ String delayExpression() default ''; /** * 在重試之間最大等待(毫秒)數的求值表達式。 * 如果小于 {@link #delay()} 則忽略。 * 重寫 {@link #maxDelay()} * 默認為0,忽略 * @since 1.2 */ String maxDelayExpression() default ''; /** * 表達式求值作為生成下次再重試延遲的乘數 * 重寫 {@link #multiplier()}。 * @since 1.2 */ String multiplierExpression() default ''; /** * 在指數情況下 ({@link #multiplier()} > 0) 設置該值為true將使再重試延遲隨機化, * 使最大延遲為先前延遲的乘數倍數,并使這兩個延遲值之間分布均勻。 * 默認為false */ boolean random() default false;}

案例

默認retry

@Componentpublic class MyTask { @Retryable public void doExecute(){ System.out.println('## current Date:' + new Date()); throw new RuntimeException('my test'); }}

輸出結果

## current Date:Sat Aug 29 21:54:55 CST 2020 ## current Date:Sat Aug 29 21:54:56 CST 2020 ## current Date:Sat Aug 29 21:54:57 CST 2020 2020-08-29 21:55:00,319 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection Exception in thread 'main' java.lang.RuntimeException: my test ...

stateful

源碼相同,注解增加屬性配置

@Retryable( stateful = true )

public void doExecute(){

輸出結果

## current Date:Sat Aug 29 21:58:56 CST 2020 2020-08-29 21:58:57,557 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection Exception in thread 'main' java.lang.RuntimeException: my test // 沒有重新拋出異常觸發重試

該參數為false時會重試3次后拋出異常,重試期間不會重新拋出異常。參數為true時則重試期間也會重新拋出異常導致重試失敗不再繼續重試

backoff.multiplier

注解屬性配置

@Retryable( backoff = @Backoff( delay = 1000, multiplier = 2), maxAttempts = 10)

輸出結果

## current Date:Sat Aug 29 23:06:50 CST 2020 ## current Date:Sat Aug 29 23:06:51 CST 2020 ## current Date:Sat Aug 29 23:06:53 CST 2020 ## current Date:Sat Aug 29 23:06:57 CST 2020 ## current Date:Sat Aug 29 23:07:05 CST 2020 ## current Date:Sat Aug 29 23:07:21 CST 2020 ## current Date:Sat Aug 29 23:07:51 CST 2020 ## current Date:Sat Aug 29 23:08:21 CST 2020 ## current Date:Sat Aug 29 23:08:51 CST 2020 ## current Date:Sat Aug 29 23:09:21 CST 2020 2020-08-29 23:09:21,949 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection Exception in thread 'main' java.lang.RuntimeException: my test

乘數正確,指數型增長,第1次延遲1s

第2次,上次延遲1s乘以乘數2=延遲2s

第3次,上次延遲2s乘以乘數2=延遲4s

指數增長,如果沒有指定則為始終如一的固定間隔延遲類型。新版本已經增加了各種類型單獨的屬性配置的模板構建者:

RetryTemplate.builder() .maxAttempts(10) .exponentialBackoff(100, 2, 10000) .retryOn(IOException.class) .traversingCauses() .build();RetryTemplate.builder() .fixedBackoff(10) .withinMillis(3000) .build();RetryTemplate.builder() .infiniteRetry() .retryOn(IOException.class) .uniformRandomBackoff(1000, 3000) .build();

backoff.random

測試代碼

@Componentpublic class MyTask { private Long lastTime = null; @Retryable( backoff = @Backoff( delay = 1000, multiplier = 2, random = true), maxAttempts = 10) public void doExecute(){ if (lastTime == null) { lastTime = System.currentTimeMillis(); } System.out.println('## actual delay:' + (System.currentTimeMillis() - lastTime) ); RuntimeException runtimeException = new RuntimeException('my test'); throw runtimeException; }}

輸出結果

## current Date:Sat Aug 29 22:53:10 CST 2020## current Date:Sat Aug 29 22:53:11 CST 2020## current Date:Sat Aug 29 22:53:14 CST 2020## current Date:Sat Aug 29 22:53:20 CST 2020## current Date:Sat Aug 29 22:53:29 CST 2020## current Date:Sat Aug 29 22:53:51 CST 2020## current Date:Sat Aug 29 22:54:41 CST 2020## current Date:Sat Aug 29 22:55:25 CST 2020## current Date:Sat Aug 29 22:56:11 CST 2020## current Date:Sat Aug 29 22:57:01 CST 20202020-08-29 22:57:01,617 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connectionException in thread 'main' java.lang.RuntimeException: my test

延遲更加隨機化,由于是最大延遲為之前延遲的乘數的倍數,所以看不出規律。它的使用場景是使延遲更加隨機化

exceptionExpression

測試代碼

@Componentpublic class MyTask { private Long lastTime = null; public boolean canRetry(RuntimeException runtimeException) { System.out.println('canRetry:'+runtimeException.hashCode()); return true; } @Retryable(exceptionExpression = '#{@myTask.canRetry(#root)}', backoff = @Backoff(delay = 1000, multiplier = 2, random = true)) public void doExecute() { if (lastTime == null) { lastTime = System.currentTimeMillis(); } System.out.println('## actual delay:' + (System.currentTimeMillis() - lastTime)); RuntimeException runtimeException = new RuntimeException('my test'); System.out.println('doExecute:'+runtimeException.hashCode()); throw runtimeException; }}

輸出結果

## actual delay:0 doExecute:626562869 2020-08-29 23:50:49,905 DEBUG [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:28 public boolean com.dianwoda.billing.settle.task.MyTask.canRetry(java.lang.RuntimeException) execute with datasource is master canRetry:626562869 2020-08-29 23:50:49,906 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection 2020-08-29 23:50:51,335 DEBUG [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:28 public boolean com.dianwoda.billing.settle.task.MyTask.canRetry(java.lang.RuntimeException) execute with datasource is master canRetry:626562869 2020-08-29 23:50:51,336 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection ## actual delay:1450 doExecute:90418597 2020-08-29 23:50:51,337 DEBUG [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:28 public boolean com.dianwoda.billing.settle.task.MyTask.canRetry(java.lang.RuntimeException) execute with datasource is master canRetry:90418597 2020-08-29 23:50:51,338 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection 2020-08-29 23:50:53,620 DEBUG [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:28 public boolean com.dianwoda.billing.settle.task.MyTask.canRetry(java.lang.RuntimeException) execute with datasource is master canRetry:90418597 2020-08-29 23:50:53,620 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection ## actual delay:3734 doExecute:307531674 2020-08-29 23:50:53,621 INFO [main] com.dianwoba.common.datasource.DataSourceAspect:invoke:32 restore database connection Exception in thread 'main' java.lang.RuntimeException: my test

注意:1.2.5之后表達式的預發有所改變,詳情可以參考官方文檔:https://github.com/spring-projects/spring-retry

以上這篇spring Retryable注解實現重試詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文字幕| 日产精品一区二区| 亚洲三级欧美| 四虎国产精品免费观看| 精品国产亚洲一区二区三区| 国产精品对白| 美女视频黄免费的久久| 国产精品久久久网站| 国产日韩欧美一区二区三区| 国产精品a级| 日韩精品首页| 日韩中文字幕麻豆| 亚洲精品大片| 国产欧美日韩视频在线| 麻豆免费精品视频| 国产精品久久久久蜜臀| 日韩大片在线播放| 在线视频日韩| 久久国产麻豆精品| 欧美1区2区3区| 欧美一区自拍| av综合电影网站| 99视频精品全部免费在线视频| 欧美jjzz| 国产精品一区二区中文字幕| 精品国产午夜| 性色av一区二区怡红| 国产高清精品二区| 激情综合网址| 国产欧美日本| 不卡av一区二区| 国产日产高清欧美一区二区三区| 久久精品国内一区二区三区| 婷婷亚洲五月| 精品三级在线观看视频| 日韩在线a电影| 色综合www| 欧美激情福利| 亚洲精品极品| 午夜在线视频观看日韩17c| 国产极品嫩模在线观看91精品| 香蕉精品久久| 国产一区三区在线播放| 在线视频亚洲欧美中文| 日韩精品电影| 精品国产不卡| 国产毛片一区二区三区| 欧美日韩国产免费观看视频| 国产传媒av在线| 久久av偷拍| 欧美极品中文字幕| 亚洲精品乱码久久久久久蜜桃麻豆| 91精品一区二区三区综合| 日本黄色精品| 国产麻豆精品久久| 亚洲午夜久久| 日韩有吗在线观看| 亚洲欧美日本国产专区一区| 久久中文字幕av| 亚洲手机在线| 女人av一区| 99精品99| 欧美日韩国产在线一区| 性欧美videohd高精| 日本а中文在线天堂| 另类专区亚洲| 色88888久久久久久影院| 欧美三级网址| 国产亚洲毛片| 色综合视频一区二区三区日韩| 中文字幕一区二区三区日韩精品| 久久国产精品久久w女人spa| 午夜一级久久| 天堂久久av| 精品一区91| 在线日韩电影| 蜜臀久久久99精品久久久久久| 中文精品视频| 日本国产亚洲| 国产一区二区三区天码| 国产一区不卡| 亚洲天堂成人| 日韩欧美中文字幕一区二区三区| 国产另类在线| 亚洲高清成人| 国产探花在线精品| 中文字幕在线免费观看视频| 九九久久婷婷| 国产日本久久| 亚洲天堂成人| 国产精品亲子伦av一区二区三区| 国产一区二区亚洲| 亚洲黄色影院| 精品五月天堂| 久久高清免费观看| 日韩不卡一区| 日本一区免费网站| 99视频精品全部免费在线视频| 中文不卡在线| 欧美日韩中文字幕一区二区三区 | 亚洲综合三区| 久久精品伊人| 亚洲精品乱码日韩| 99tv成人| 亚洲日本网址| 欧美日本精品| 亚洲精品三级| 午夜久久久久| 九九精品调教| 国模精品一区| 色一区二区三区| 夜久久久久久| 精品理论电影在线| 亚州国产精品| www在线观看黄色| 亚洲a级精品| 一区二区精品伦理...| 成人自拍av| 蜜桃av.网站在线观看| 日本欧美在线| 极品av在线| 国内不卡的一区二区三区中文字幕 | 97在线精品| 国产精品欧美大片| 青青青国产精品| 捆绑调教日本一区二区三区| 日韩精品久久久久久| 日韩欧美中文字幕一区二区三区| 免费在线视频一区| 水蜜桃久久夜色精品一区的特点 | 青草国产精品| 热久久久久久久| 爽好多水快深点欧美视频| 日本大胆欧美人术艺术动态| 噜噜噜久久亚洲精品国产品小说| 蜜桃一区二区三区| 亚洲欧美日本日韩| 亚洲精品在线国产| 日本午夜精品| 精品在线网站观看| 毛片在线网站| 亚洲国产不卡| 日韩精品1区2区3区| 欧美激情福利| 欧美精选一区二区三区| 免费在线观看日韩欧美| 只有精品亚洲| 美女视频网站久久| 国产一区二区中文| 日本少妇一区二区| 国产91欧美| 欧美专区18| 精品免费在线| 伊人www22综合色| 久久精品资源| 亚洲欧美日韩国产综合精品二区| 综合一区二区三区| 成人午夜亚洲| 日韩精品成人| 91精品啪在线观看国产18| 亚洲深夜福利在线观看| 久久一区精品| 老鸭窝毛片一区二区三区| 国产精品久久久久久模特| 在线一区电影| 你懂的国产精品永久在线| 99国产精品久久久久久久成人热| 91久久精品无嫩草影院| 亚洲韩日在线| 国产+成+人+亚洲欧洲在线| 综合一区在线| 欧美日韩国产欧| 偷拍精品精品一区二区三区| 日本va欧美va精品| 欧美在线综合| 国产精品91一区二区三区| 国产精品视频首页| 日韩中文av| 中文字幕一区二区三区在线视频| 日韩欧美一区二区三区在线观看| 国产精品乱战久久久| 日韩一区二区三区在线看| 欧美日韩国产免费观看 | 香蕉久久久久久| 日韩在线观看一区二区| 日韩视频二区| 欧美1区免费| 好看的亚洲午夜视频在线| 亚洲电影在线一区二区三区| 亚洲精品免费观看| 精品国产一区二| 久久精品99国产精品日本| 亚洲日产av中文字幕| 久久国产婷婷国产香蕉| 91国内精品| 国产精品99免费看| 国产精品一区高清| 国产精品一区毛片| 国产精品二区影院| 国产精品亚洲综合在线观看|