使用spring-retry實現重試機制 原

我們經常會遇到一些場景,需要重試當前的操作,比如:文件上傳失敗,重新上傳;微信accesstoken獲取失敗,重新獲取等等的場景問題。那麼今天就說一種可以實現此種機制的工具包:spring-retry。

如圖,可以看到spring-retry最新版本是1.2.2.RELEASE, 該工具把重試操作模板定製化,可以設置重試策略和回退策略。同時重試執行實例保證線程安全

要是用它,先引入架包:

<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

具體的代碼實現:

         // 構建重試模板實例
		RetryTemplate retry=new RetryTemplate();
		//設置重試策略,主要設置重試次數
		SimpleRetryPolicy srp = new SimpleRetryPolicy(); 
		srp.setMaxAttempts(3);// 重試3次 
		//設置重試回退操作策略,主要設置重試間隔時間
		FixedBackOffPolicy fbop = new FixedBackOffPolicy();
		fbop.setBackOffPeriod(2000);//重試間隔2s,單位ms
		retry.setRetryPolicy(srp);
		retry.setBackOffPolicy(fbop);
		
		//重試器,重試成功後返回 true
		final RetryCallback<Object, Exception> dmReCall=new RetryCallback<Object, Exception>(){
			@Override 
			public Object doWithRetry(RetryContext context) throws Exception {// 開始重試 
				//這裏填寫要重試的邏輯代碼
				System.out.println("do some thing");
                 //規定在哪種狀態下,發生異常,纔會進行重試
                 if(true){

                      throw new RuntimeException();//這裏需要注意,重試的根源是拋出異常
                   }
                                
				return null; //成功之後返回的數據,可以是任意數據類型
			}
		};
		//重試失敗後,執行-
		final RecoveryCallback<Object> rvcb=new RecoveryCallback<Object>(){
			@Override 
			public Object recover(RetryContext context) throws Exception { // 重試多次後都失敗了 
			        //這裏可以添加最後失敗的代碼邏輯	
                    logger.info("------- RecoveryCallback --------");
				return false; //重試後失敗返回的數據,可以是任意數據類型
			} 
		};
		//刪除菜單重試機制開始
		try {
			
			Object obj = retry.execute(dmReCall,rvcb);
			//這裏可以根據obj的數據進行判斷,重試最終成功了,還是失敗了。
			System.out.println("do some obj");
		} catch (Exception e) {
			//error
		}

RetryTemplate 承擔了重試執行者的角色,它可以設置SimpleRetryPolicy(重試策略,設置重試上限,重試的根源實體),FixedBackOffPolicy(固定的回退策略,設置執行重試回退的時間間隔)。      RetryTemplate通過execute提交執行操作,需要準備RetryCallback 和RecoveryCallback 兩個類實例,前者對應的就是重試回調邏輯實例,包裝正常的功能操作,RecoveryCallback實現的是整個執行操作結束的恢復操作實例。同時RetryTemplate的execute 是線程安全的。

有重試機制需要的,可以嘗試下這個工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章