我們經常會遇到一些場景,需要重試當前的操作,比如:文件上傳失敗,重新上傳;微信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 是線程安全的。
有重試機制需要的,可以嘗試下這個工具。