Spring @Retryable重試方法呼叫詳解

zhzhf233發表於2020-12-11

Spring @Retryable重試方法呼叫詳解

一、使用方法

1.引入maven包
 <!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
 <dependency>
     <groupId>org.springframework.retry</groupId>
     <artifactId>spring-retry</artifactId>
     <version>1.2.4.RELEASE</version>
 </dependency>
2.配置啟用重試功能

1.springboot專案可以直接在啟動類上新增註解:@EnableRetry

@SpringBootApplication
@EnableRetry
public class XXXApplication {
	public static void main(String[] args) {
		SpringApplication.run(XXXApplication.class, args);
	}
}

2.springMVC專案可以直接新增配置檔案,通過@Configuration配置Spring容器,通過@EnableRetry啟用重試功能

@Configuration
@EnableRetry
public class RetryConfig {
}
3.新增需要進行重試的業務方法,@Retryable對該方法啟用重試
@Retryable註解中的引數說明:
  • 1)value:丟擲指定異常才會重試(value不為空是,include和exclude不生效)
  • 2)include:指定需要處理的異常,預設為空,當exclude也為空時,所有異常都重試
  • 3)exclude:指定不處理的異常,預設為空,當include也為空時,所有異常都重試
  • 4)maxAttempts:最大重試次數,預設為3,如果要設定的重試次數為3,可以不寫; backoff:重試等待策略。
    • delay:等待間隔時間
    • maxDelay:最大等待間隔時間(預設為30s)
    • multiplier:等待間隔時間放大倍數。例如(delay=2000,multiplier=2時,則重試時間為2,4,8,16……,但<=maxDelay值)

例如下圖:捕獲異常為ResultException, 2秒執行一次,每次遞增2倍,最多每10秒執行一次,最多重試60次。

@Retryable(value = ResultException.class, maxAttempts = 60, backoff = @Backoff(delay = 2000L,maxDelay = 10000L, multiplier = 2))
public void test(String testParam) throws ResultException {
    System.out.println(testParam);
    throw new ResultException("丟擲指定異常,重試");
}

二、常見問題

1.設定的每60秒執行一次,實際30秒執行一次

原因:沒有設定最大等待間隔時間maxDelay(預設為30s)。

2.重試功能沒有生效

原因:可能是將重試方法作為內嵌方法呼叫了(作為內嵌方法呼叫時不生效)

如下這種方式呼叫,重試不會生效。
原因是:由於Retryalbe用到了aspect增強,所以會有aspect的坑,就是方法內部呼叫,會使aspect增強失效,那麼Retryalbe當然也會失效。
public class Test{
	public void a(){
		b();
	}
	@Retryalbe
	public void b(){
	}
}

本文完。

相關文章