前言
什么時候需要重處理?
在實際工作中,重處理是一個非常常見的場景,比如:發(fā)送消息失敗,調(diào)用遠(yuǎn)程服務(wù)失敗,爭搶鎖失敗,等等,這些錯誤可能是因為網(wǎng)絡(luò)波動造成的,等待過后重處理就能成功.通常來說,會用try/catch,while循環(huán)之類的語法來進(jìn)行重處理,但是這樣的做法缺乏統(tǒng)一性,并且不是很方便,要多寫很多代碼.然而spring-retry卻可以通過注解,在不入侵原有業(yè)務(wù)邏輯代碼的方式下,優(yōu)雅的實現(xiàn)重處理功能.
思路
使用@Retryable和@Recover實現(xiàn)重處理,以及重處理失后的回調(diào)
實現(xiàn)
1.pom引用
1
2
3
4
|
< dependency > < groupId >org.springframework.retry</ groupId > < artifactId >spring-retry</ artifactId > </ dependency > |
2.應(yīng)用啟動類開啟retry
....其他注解
1
2
3
4
|
@EnableRetry public class BaseApplication { ....... } |
3.在指定方法上標(biāo)記@Retryable來開啟重試
1
2
3
4
5
6
7
8
9
10
11
12
|
@Retryable (value={A異常. class ,B異常. class }, maxAttempts=重試次數(shù), backoff = @Backoff (value = 每次重試延遲毫秒數(shù))) 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.在指定方法上標(biāo)記@Recover來開啟重試失敗后調(diào)用的方法(注意,需跟重處理方法在同一個類中)
1
2
3
4
5
6
7
8
9
|
@Recover public void recover(A異常 e) { // ... do something } @Recover public void recover(B異常 e) { // ... do something } |
結(jié)束
演示了單spring boot的應(yīng)用的,在后續(xù)的cloud場景中,如:zuul,等組件,都會涉及到重處理,會在后續(xù)的章節(jié)中講解
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://my.oschina.net/wangkang80/blog/912941