使用@Retryable來進行重處理
阿新 • • 發佈:2019-02-18
###什麼時候需要重處理?
在實際工作中,重處理是一個非常常見的場景,比如:傳送訊息失敗,呼叫遠端服務失敗,爭搶鎖失敗,等等,這些錯誤可能是因為網路波動造成的,等待過後重處理就能成功.通常來說,會用try/catch,while迴圈之類的語法來進行重處理,但是這樣的做法缺乏統一性,並且不是很方便,要多寫很多程式碼.然而
spring-retry
卻可以通過註解,在不入侵原有業務邏輯程式碼的方式下,優雅的實現重處理功能.
##思路
使用@Retryable和@Recover實現重處理,以及重處理失後的回撥
##實現
###1.pom引用
<dependency>
<groupId >org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
###2.應用啟動類開啟retry
....其他註解
@EnableRetry
public classBaseApplication{
.......
}
###3.在指定方法上標記@Retryable來開啟重試
@Retryable(value={A異常.class,B異常.class},
maxAttempts=重試次數,
backoff = @Backoff (value = 每次重試延遲毫秒數))
public Integer retry() {
LOGGER.info("測試retry");
final int a = 5;
int num = new SecureRandom().nextInt();
if (num % a == 0) {
return num;
}
throw new RetryException("重試失敗");
}
###4.在指定方法上標記@Recover來開啟重試失敗後呼叫的方法(注意,需跟重處理方法在同一個類中)
@Recover
public void recover(A異常 e) {
// ... do something
}
@Recover
public void recover(B異常 e) {
// ... do something
}