Spring的重試機制@Retryable注解


  日常開發中經常會遇到接口調用失敗的問題,尤其是兩個系統對接時,當接口調用失敗通常會使用一些方法來進行重試,比如for循環while等,但是這種方式代碼入侵性比較大而且不變維護。

 

  實際上spring已經實現了相關功能,通過@Retryable注解在不入侵原有業務邏輯代碼的方式下,優雅的實現重處理功能。

  @Retryable官方解釋

 

   

 

 

 使用步驟

  1、添加依賴

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

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

  2、在啟動類或者配置類或者需重試方法所在的類上添加注解@EnableRetry

  啟動類示例

@SpringBootApplication
@EnableRetry
public class DataTransferApplication {

	public static void main(String[] args) {

		SpringApplication.run(DataTransferApplication.class, args);
	}
}

  配置類示例

@EnableRetry
@Configuration
public class RetryConfig {
}

  3、在需要重試的方法上添加@Retryable注解

 

   @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    @Override
    public RetResult manualUploadTemporaryTask(ManualUploadTemporaryTaskReq req) {
        System.out.println("manualUploadTemporaryTask" + "********");
        for (int i = 0 ; i < 5 ; i ++){
            int a = 0 / i;
        }
        return RetResponse.makeOKRsp();
    }

    @Recover
    public RetResult temporaryTaskRecover(Exception e,ManualUploadTemporaryTaskReq req){
        System.out.println("異常信息是:" + e.getMessage());
        System.out.println("=============" + req.toString());
        return RetResponse.makeErrRsp("上傳失敗請稍后再試");
    }

 

  運行結果

 

 

   參數說明,Retryable參數列表畢竟多選擇幾個常用的解釋一下,具體可以看官網

  interceptor:可以通過該參數,指定方法攔截器的bean名稱

  value:拋出指定異常才會重試

  include:和value一樣,默認為空,當exclude也為空時,默認所以異常

  exclude:指定不處理的異常

  maxAttempts:最大重試次數,默認3次

  backoff:重試等待策略,默認使用@Backoff,@Backoff的value默認為1000L,我們設置為2000L;multiplier(指定延遲倍數)默認為0,表示固定暫停1秒后進行重試,如果把multiplier設置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。

  @Recover說明

  當重試耗盡時,用於@Retryable重試失敗后處理方法,此方法里的異常一定要是@Retryable方法里拋出的異常,否則不會調用這個方法。

  1、方法的返回值必須與@Retryable方法一致

  2、方法的第一個參數,必須是Throwable類型的,建議是與@Retryable配置的異常一致,其他的參數,需要與@Retryable方法的參數一致

  3、@Retryable方法和@Recover方法要在同一類中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM