集成spring重试策略

系统管理员 2022-11-19 01:13 96阅读 0赞

最近在做服务端需求,涉及到重试场景。重试有很多注意的点。比如:方法兜底,指数退避策略等等。如果自己实现的话,需要注意的点很多。spring提供了重试解决方案spring retry,今天调研了一下,使用起来很方便,分享一下。
1.引入依赖

  1. <dependency>
  2. <!--spring retry依赖-->
  3. <groupId>org.springframework.retry</groupId>
  4. <artifactId>spring-retry</artifactId>
  5. <version>1.2.4.RELEASE</version>
  6. </dependency>
  7. <!--retry底层依赖AOP实现,所以需要引入aspectj的依赖-->
  8. <dependency>
  9. <groupId>org.aspectj</groupId>
  10. <artifactId>aspectjweaver</artifactId>
  11. <version>1.9.4</version>
  12. </dependency>

2.启用spring retry

  1. @SpringBootApplication
  2. //启用spring retry依赖
  3. @EnableRetry
  4. public class Application {
  5. /**
  6. * spring boot的入口
  7. * @param args
  8. */
  9. public static void main(String[] args) {
  10. SpringApplication.run(Application.class,args);
  11. }
  12. }

3.编写测试业务类

  1. package org.example.service;
  2. import org.springframework.retry.annotation.Backoff;
  3. import org.springframework.retry.annotation.Recover;
  4. import org.springframework.retry.annotation.Retryable;
  5. import org.springframework.stereotype.Service;
  6. import java.time.LocalDateTime;
  7. @Service
  8. public class WorkService {
  9. /**
  10. * 默认重试3次(包含第一次执行失败)
  11. */
  12. @Retryable
  13. public void work1() {
  14. System.out.println("执行方法1:" + LocalDateTime.now());
  15. throw new RuntimeException();
  16. }
  17. /**
  18. * 捕捉到RuntimeException异常时执行重试,最大重试4次,指数退避策略为2秒,每次重试*2,即第一次等待2秒,第二次重试等待4秒,第三次8秒,以此类推
  19. */
  20. @Retryable(include = {RuntimeException.class}, maxAttempts = 4, backoff = @Backoff(delay = 2000L, multiplier = 2))
  21. public void work2() {
  22. System.out.println("执行方法2:" + LocalDateTime.now());
  23. throw new RuntimeException();
  24. }
  25. /**
  26. *
  27. */
  28. @Retryable(include = NullPointerException.class)
  29. public void work3() {
  30. System.out.println("执行方法3:" + LocalDateTime.now());
  31. throw new NullPointerException();
  32. }
  33. /**
  34. * NullPointerException重试补偿方法。当重试完成后,执行该补偿方法
  35. * @param e
  36. */
  37. @Recover
  38. public void recover(NullPointerException e) {
  39. System.out.println("执行补偿方法:" + LocalDateTime.now());
  40. }
  41. /**
  42. * RuntimeException重试补偿方法。当重试完成后,执行该补偿方法
  43. * @param e
  44. */
  45. @Recover
  46. public void recover(RuntimeException e) {
  47. System.out.println("执行补偿方法:" + LocalDateTime.now());
  48. }
  49. }

4.编写测试方法
(1).测试方法依赖

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.12</version>
  5. <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. </dependency>

(2).测试方法

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringBootTest(classes = Application.class)
  3. public class ApplicationTest {
  4. @Autowired
  5. private WorkService workService;
  6. /**
  7. * Rigorous Test :-)
  8. */
  9. @Test
  10. public void shouldAnswerWithTrue() {
  11. workService.work2();
  12. }
  13. }

5.测试结果

  1. //我们调用的是work2方法,所以可以看到指数退避策略
  2. 执行方法2:2021-04-13T21:45:19.746
  3. 执行方法2:2021-04-13T21:45:21.747
  4. 执行方法2:2021-04-13T21:45:25.748
  5. 执行方法2:2021-04-13T21:45:33.748
  6. 执行补偿方法:2021-04-13T21:45:33.748

以上就是spring retry的使用。下一篇聊聊spring retry的底层实现。

发表评论

表情:
评论列表 (有 0 条评论,96人围观)

还没有评论,来说两句吧...

相关阅读

    相关 集成spring策略

    最近在做服务端需求,涉及到重试场景。重试有很多注意的点。比如:方法兜底,指数退避策略等等。如果自己实现的话,需要注意的点很多。spring提供了重试解决方案spring ret

    相关 Spring Retry机制

    在调用第三方接口或者使用mq时,会出现网络抖动,连接超时等网络异常,所以需要重试。为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功。例