成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊一個注解實現接口重試

開發 前端
通常來說,會用try/catch,while?循環之類的語法來進行重處理,但是這樣的做法缺乏統一性,并且不是很方便,要多寫很多代碼。然而spring-retry卻可以通過注解,在不入侵原有業務邏輯代碼的方式下,優雅的實現重處理功能。

在實際工作中,重處理是一個非常常見的場景,比如:

  • 發送消息失敗。
  • 調用遠程服務失敗。
  • 爭搶鎖失敗。

這些錯誤可能是因為網絡波動造成的,等待過后重處理就能成功。通常來說,會用try/catch,while?循環之類的語法來進行重處理,但是這樣的做法缺乏統一性,并且不是很方便,要多寫很多代碼。然而spring-retry卻可以通過注解,在不入侵原有業務邏輯代碼的方式下,優雅的實現重處理功能。

1.@Retryable是什么?

spring系列的spring-retry?是另一個實用程序模塊,可以幫助我們以標準方式處理任何特定操作的重試。在spring-retry中,所有配置都是基于簡單注釋的。

2.使用步驟

(1) POM依賴

<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

(2)啟用@Retryable

@EnableRetry
@SpringBootApplication
public class HelloApplication {

public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}

}

(3)在方法上添加@Retryable

import com.mail.elegant.service.TestRetryService;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import java.time.LocalTime;

@Service
public class TestRetryServiceImpl implements TestRetryService {

@Override
@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public int test(int code) throws Exception{
System.out.println("test被調用,時間:"+LocalTime.now());
if (code==0){
throw new Exception("情況不對頭!");
}
System.out.println("test被調用,情況對頭了!");

return 200;
}
}

來簡單解釋一下注解中幾個參數的含義:

  • value:拋出指定異常才會重試。
  • include:和value一樣,默認為空,當exclude也為空時,默認所有異常。
  • exclude:指定不處理的異常。
  • maxAttempts:最大重試次數,默認3次。
  • backoff?:重試等待策略,默認使用@Backoff,@Backoff?的value默認為1000L,我們設置為2000L;multiplier?(指定延遲倍數)默認為0,表示固定暫停1秒后進行重試,如果把multiplier設置為1.5,則第一次重試為2秒,第二次為3秒,第三次為4.5秒。

當重試耗盡時還是失敗,會出現什么情況呢?

當重試耗盡時,RetryOperations?可以將控制傳遞給另一個回調,即RecoveryCallback。Spring-Retry?還提供了@Recover注解,用于@Retryable重試失敗后處理方法。如果不需要回調方法,可以直接不寫回調方法,那么實現的效果是,重試次數完了后,如果還是沒成功沒符合業務判斷,就拋出異常。

(4)@Recover

@Recover
public int recover(Exception e, int code){
System.out.println("回調方法執行!!!!");
//記日志到數據庫 或者調用其余的方法
return 400;
}

可以看到傳參里面寫的是 Exception e?,這個是作為回調的接頭暗號(重試次數用完了,還是失敗,我們拋出這個Exception e?通知觸發這個回調方法)。對于@Recover注解的方法,需要特別注意的是:

  • 方法的返回值必須與@Retryable方法一致。
  • 方法的第一個參數,必須是Throwable類型的,建議是與@Retryable?配置的異常一致,其他的參數,需要哪個參數,寫進去就可以了(@Recover方法中有的)。
  • 該回調方法與重試方法寫在同一個實現類里面。
  • 復java面試,獲取最新面試題資料。

(5)注意事項

  • 由于是基于AOP實現,所以不支持類里自調用方法。
  • 如果重試失敗需要給@Recover注解的方法做后續處理,那這個重試的方法不能有返回值,只能是void。
  • 方法內不能使用try catch,只能往外拋異常。
  • @Recover?注解來開啟重試失敗后調用的方法(注意,需跟重處理方法在同一個類中),此注解注釋的方法參數一定要是@Retryable拋出的異常,否則無法識別,可以在該方法中進行日志處理。

3.總結

本篇主要簡單介紹了Springboot中的Retryable的使用,主要的適用場景和注意事項,當需要重試的時候還是很有用的。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2025-03-11 08:20:58

2023-11-06 08:00:38

接口高可用機制

2023-06-05 08:22:20

2022-11-17 07:43:13

2022-06-21 14:44:38

接口數據脫敏

2024-11-07 10:55:26

2024-11-08 15:56:36

2025-02-23 08:00:00

冪等性Java開發

2023-08-01 08:54:02

接口冪等網絡

2009-08-24 10:47:45

C#接口重實現

2022-05-16 10:45:22

Redis接口限流緩存

2023-08-21 08:01:03

2024-07-15 08:25:07

2021-11-05 07:59:25

HashMapJava知識總結

2021-04-28 14:31:35

Dubbo接口日志

2022-03-06 19:57:50

狀態機easyfsm項目

2022-05-26 10:42:30

數據權限注解

2022-03-22 06:33:49

Python內置模塊函數

2024-04-07 08:48:13

WebSocket集群MQ

2022-11-11 07:34:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级大片 | 91xxx在线观看 | 国产1区| 亚洲精品一区二区网址 | 国产精品黄视频 | 国产精品久久国产精品久久 | 中文字幕韩在线第一页 | 在线观看免费高清av | 色视频欧美 | 亚洲欧洲在线观看视频 | 99在线免费观看视频 | 福利视频大全 | 久久久123| 欧美精品三区 | 欧美日韩电影一区二区 | 中国一级特黄毛片大片 | 国产精品视频一区二区三区不卡 | 久久久久久国产精品 | 麻豆视频在线免费观看 | 一区二区三区国产 | 国产黄色大片在线观看 | 中文字幕在线第二页 | 国产高清在线精品 | 欧美亚洲国产日韩 | 日韩中文字幕第一页 | 亚洲精品电影网在线观看 | 久久久久久久久久久久久9999 | www.youjizz.com日韩 | 久久毛片 | 在线电影日韩 | 日美女逼逼 | 天天在线操| 91直接看 | 日韩精品一区二区在线观看 | 亚洲经典一区 | 欧美国产精品一区二区三区 | 精品视频一区二区三区 | 成人在线视频免费观看 | 久久久久国产一区二区三区四区 | 成人一级片在线观看 | 亚洲欧美日韩久久久 |