Spring的重試機制:淺談@Retryable和@Recover注解

??在我們的日常開發(fā)中,經(jīng)查會遇到調用接口失敗的情況,這時候就需要通過一些方法來進行重試,比如通過while循環(huán)手動重復調用或是通過JDK/CGLib動態(tài)代理的方式來進行重試。但是這種方法比較笨重,且對原有邏輯代碼的入侵性比較大仇箱。

while-retry

cglib-retry

??實際上,Spring已經(jīng)為我們提供了封裝好的重試功能东羹,spring-retry剂桥,使我們可以通過@Retryable和@Recover注解來完成重試和重試失敗后的回調。
spring-annotation-retry

??如上圖中的代碼所示百姓,我們通過@Retryable注解渊额,對RemoteAccessException異常進行重試,重試次數(shù)為2次,第一次重試間隔為5s旬迹,之后重試的時間間隔為前一次的2倍火惊,第二次重試間隔10s,第三次重試間隔20s奔垦。然后通過@Recover注解設定當重試到達指定次數(shù)時屹耐,將要回調的方法。
我們來看看@Retryable注解中有什么內(nèi)容:
@Retryable

參數(shù) 含義
interceptor 重試攔截器bean名稱椿猎,用于可重試方法
value 可重試的異常類型惶岭。含義同include。
默認為空(如果excludes也為空犯眠,則重試所有異常)
include 可重試的異常類型按灶。默認為空(如果excludes也為空,則重試所有異常)
exclude 無需重試的異常類型筐咧。默認為空(如果includes也為空鸯旁,則重試所有異常)
label 統(tǒng)計報告的唯一標簽。如果未提供量蕊,
則調用者可以選擇忽略它或提供一個默認值铺罢。
我的理解就是這個重試方法的唯一名稱
stateful 若為true,標志重試是有狀態(tài)的:即重新拋出異常残炮,
但是重試策略與相同的策略應用于具有相同參數(shù)的后續(xù)調用韭赘。
若為false,則不會重新引發(fā)可重試的異常
maxAttempts 最大重試次數(shù)(包括第一次失敗)势就,默認為3次
maxAttemptsExpression 計算最大嘗試次數(shù)(包括第一次失敗)的表達式泉瞻,默認為3 次
backoff 重試等待策略,下面會在@Backoff中介紹
exceptionExpression 指定在SimpleRetryPolicy.canRetry()返回true之后要求值的表達式-可用于有條件地禁止重試。

另外苞冯,還有@Backoff注解:


@Backoff
參數(shù) 含義
value 這個我不知道瓦灶,原文是"A canonical backoff period."
delay 重試之間的等待時間(以毫秒為單位)
maxDelay 重試之間的最大等待時間(以毫秒為單位)
multiplier 指定延遲的倍數(shù)
delayExpression 重試之間的等待時間表達式
maxDelayExpression 重試之間的最大等待時間表達式
multiplierExpression 指定延遲的倍數(shù)表達式
random 隨機指定延遲時間

除了使用注解來實現(xiàn)方法重試以外,Spring還提供了RetryTemplate來顯式進行方法的重試抱完,大致實現(xiàn)方式如下圖所示:
RetryTemplate

從圖中可以發(fā)現(xiàn),我們可以通過setRetryPolicy()方法來為RetryTemplate設置重試策略刃泡。Spring為我們提供了6種重試策略:
1.NeverRetryPolicy:只允許調用 RetryCallback 一次巧娱,不允許重試
2.AlwaysRetryPolicy:允許無限重試,直到成功烘贴,此方式邏輯不當會導致死循環(huán)
3.SimpleRetryPolicy:固定次數(shù)重試策略禁添,默認重試最大次數(shù)為 3 次,RetryTemplate 默認使用的策略
4.TimeoutRetryPolicy:超時時間重試策略桨踪,默認超時時間為 1 秒老翘,在指定的超時時間內(nèi)允許重試
5.CircuitBreakerRetryPolicy:有熔斷功能的重試策略,需設置 3 個參數(shù) openTimeout、resetTimeout 和 delegate
6.CompositeRetryPolicy:組合重試策略铺峭。有兩種組合方式墓怀,樂觀組合重試策略是指只要有一個策略允許重試即可以,悲觀組合重試策略是指只要有一個策略不允許重試即不可以卫键。但不管哪種組合方式傀履,組合中的每一個策略都會執(zhí)行

在使用@Retryable和@Recover注解時,有幾點需要注意:
首先莉炉,要添加maven依賴
<dependency>
?? <groupId>org.springframework.retry</groupId>
??<artifactId>spring-retry</artifactId>
</dependency>
并添加@EnableRetry注解使@Retryable和@Recover注解生效钓账。
另外@Retryable和@Recover修飾的方法要在同一個類中,且被@Retryable 標記的方法不能有返回值,這樣Recover方法才會生效絮宁。
最后,由于@Retryable注解是通過切面實現(xiàn)的梆暮,因此我們要避免@Retryable 注解的方法的調用方和被調用方處于同一個類中,因為這樣會使@Retryable 注解失效绍昂。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啦粹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子治专,更是在濱河造成了極大的恐慌卖陵,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件张峰,死亡現(xiàn)場離奇詭異泪蔫,居然都是意外死亡,警方通過查閱死者的電腦和手機喘批,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門撩荣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饶深,你說我怎么就攤上這事餐曹。” “怎么了敌厘?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵台猴,是天一觀的道長。 經(jīng)常有香客問我俱两,道長饱狂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任宪彩,我火速辦了婚禮休讳,結果婚禮上,老公的妹妹穿的比我還像新娘尿孔。我一直安慰自己俊柔,他們只是感情好筹麸,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雏婶,像睡著了一般物赶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尚骄,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天块差,我揣著相機與錄音,去河邊找鬼倔丈。 笑死憨闰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的需五。 我是一名探鬼主播鹉动,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宏邮!你這毒婦竟也來了泽示?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜜氨,失蹤者是張志新(化名)和其女友劉穎械筛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飒炎,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡埋哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了郎汪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赤赊。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖煞赢,靈堂內(nèi)的尸體忽然破棺而出抛计,到底是詐尸還是另有隱情,我是刑警寧澤照筑,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布吹截,位于F島的核電站,受9級特大地震影響凝危,放射性物質發(fā)生泄漏饭弓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一媒抠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咏花,春花似錦趴生、人聲如沸阀趴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刘急。三九已至,卻和暖如春浸踩,著一層夾襖步出監(jiān)牢的瞬間叔汁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工检碗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留据块,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓折剃,卻偏偏與公主長得像另假,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怕犁,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359