Spring Boot-整合Retry框架重試機制


一、背景

  • 調用第三方接口,按照最大次數輪詢去獲取結果,或因為網絡波動導致超時等。
  • 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;
}

再次執行時,結果如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM