一、背景
- 調用第三方接口,按照最大次數輪詢去獲取結果,或因為網絡波動導致超時等。
- Retry重試框架,支持AOP切入的方式使用,支持注解;重試次數、重試延遲、重試觸發條件、重試的回調方法等功能來實現重試機制
二、整合Retry
2.1 pom文件加入依賴
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency>
2.2 容器啟動類上添加注解@EnableRetry
@EnableRetry @SpringBootApplication public class ParamApplication { public static void main(String[] args) { SpringApplication.run(ParamApplication.class, args); } }
2.3 支付服務類PayService,獲取剩余數量
@Slf4j @Service public class PayService { private final static int TOTAL_NUM = 100000; @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2)) public int getRemainingAmount(int num) throws Exception { log.info("getRemainingAmount======" + LocalTime.now()); if (num <= 0) { throw new Exception("數量不對"); } log.info("getRemainingAmount======執行結束"); return TOTAL_NUM - num; } }
@Retryable:標記當前方法使用重試機制
value:觸發重試機制的條件,當遇到Exception時,會重試
maxAttempts :設置最大重試次數,默認為3次
delay:重試延遲時間,單位毫秒,即距離上一次重試方法的間隔
multiplier:delay重試延遲時間的間隔倍數,即第一次為5秒,第二次為5乘以2為10秒,依此類推
三、測試
創建controller類
@Slf4j @RestController @RequestMapping("/retry") public class RetryController { @Resource private PayService payService; @PostMapping("/test") public String retryTest(@RequestParam int num) throws Exception { int remainingnum = payService.getRemainingAmount(num); log.info("剩余數量===" + remainingnum); return "success"; } }
postman調用

可以看到,第一次用時5S,第二次用時10S,第三次用時15S;
最后會拋出異常,可以在上層代碼進行try-catch處理相關業務邏輯;
也可以寫回調方法處理,在PayService類中添加如下代碼,@Recover:當重試方法發生異常時,會執行該回調方法
@Recover public int recover(Exception e) { // 回調方法,業務邏輯處理 return -1; }
再次執行時,結果如下

