SpringBoot整合Retry如何实现错误重试

其他教程   发布日期:2023年07月15日   浏览次数:430

本文小编为大家详细介绍“SpringBoot整合Retry如何实现错误重试”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot整合Retry如何实现错误重试”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    引入依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-aop</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.springframework.retry</groupId>
    7. <artifactId>spring-retry</artifactId>
    8. </dependency>

    完整依赖pom.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <parent>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-parent</artifactId>
    8. <version>2.7.7</version>
    9. <relativePath/> <!-- lookup parent from repository -->
    10. </parent>
    11. <groupId>com.example</groupId>
    12. <artifactId>demo</artifactId>
    13. <version>0.0.1-SNAPSHOT</version>
    14. <name>demo</name>
    15. <description>Demo project for Spring Boot</description>
    16. <properties>
    17. <java.version>1.8</java.version>
    18. </properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.boot</groupId>
    22. <artifactId>spring-boot-starter-web</artifactId>
    23. </dependency>
    24. <dependency>
    25. <groupId>org.springframework.boot</groupId>
    26. <artifactId>spring-boot-devtools</artifactId>
    27. <scope>runtime</scope>
    28. <optional>true</optional>
    29. </dependency>
    30. <dependency>
    31. <groupId>org.projectlombok</groupId>
    32. <artifactId>lombok</artifactId>
    33. <optional>true</optional>
    34. </dependency>
    35. <dependency>
    36. <groupId>org.springframework.boot</groupId>
    37. <artifactId>spring-boot-starter-test</artifactId>
    38. <scope>test</scope>
    39. </dependency>
    40. <!-- spring-retry -->
    41. <dependency>
    42. <groupId>org.springframework.boot</groupId>
    43. <artifactId>spring-boot-starter-aop</artifactId>
    44. </dependency>
    45. <dependency>
    46. <groupId>org.springframework.retry</groupId>
    47. <artifactId>spring-retry</artifactId>
    48. </dependency>
    49. </dependencies>
    50. <build>
    51. <plugins>
    52. <plugin>
    53. <groupId>org.springframework.boot</groupId>
    54. <artifactId>spring-boot-maven-plugin</artifactId>
    55. <configuration>
    56. <excludes>
    57. <exclude>
    58. <groupId>org.projectlombok</groupId>
    59. <artifactId>lombok</artifactId>
    60. </exclude>
    61. </excludes>
    62. </configuration>
    63. </plugin>
    64. </plugins>
    65. </build>
    66. </project>

    开启spring-retry

    启动类上增加注解

    1. @EnableRetry
    1. package com.example.demo;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.retry.annotation.EnableRetry;
    5. @EnableRetry
    6. @SpringBootApplication
    7. public class Application {
    8. public static void main(String[] args) {
    9. SpringApplication.run(Application.class, args);
    10. }
    11. }

    使用重试注解

    @Retryable注解

    • value,可重试的异常类型。含义同include。默认为空(如果excludes也为空,则重试所有异常)

    • include:可重试的异常类型。默认为空(如果excludes也为空,则重试所有异常)

    • exclude:无需重试的异常类型。默认为空(如果includes也为空,则重试所有异常)

    • maxAttempts:最大重试次数(包括第一次失败),默认为3次

    • backoff:重试等待策略,下面会在@Backoff中介绍

    • recover:表示重试次数到达最大重试次数后的回调方法

    @Backoff注解

    • delay,重试之间的等待时间(以毫秒为单位)

    • maxDelay,重试之间的最大等待时间(以毫秒为单位)

    • multiplier,指定延迟的倍数

    • delayExpression,重试之间的等待时间表达式

    • maxDelayExpression,重试之间的最大等待时间表达式

    • multiplierExpression,指定延迟的倍数表达式

    • random,随机指定延迟时间

    使用示例

    1. package com.example.demo.component;
    2. import org.springframework.retry.annotation.Recover;
    3. import org.springframework.retry.annotation.Retryable;
    4. import org.springframework.stereotype.Component;
    5. @Component
    6. public class HttpRequest {
    7. private int count = 0;
    8. /**
    9. * 模拟网络请求异常
    10. * @return
    11. */
    12. @Retryable(recover = "errorHandler")
    13. public String getResponse() {
    14. count++;
    15. System.out.println("time: " + count);
    16. if (count < 4) {
    17. throw new RuntimeException("count: " + count);
    18. }
    19. return "success";
    20. }
    21. /**
    22. * 错误处理函数
    23. * 注意:需要返回 String,否则会抛出方法找不到异常
    24. * org.springframework.retry.ExhaustedRetryException: Cannot locate recovery method
    25. *
    26. * @param e
    27. * @return
    28. */
    29. @Recover
    30. public String errorHandler(RuntimeException e) {
    31. System.out.println("errorHandler");
    32. return "ok";
    33. }
    34. }

    测试

    1. package com.example.demo.component;
    2. import org.junit.jupiter.api.Test;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.test.context.SpringBootTest;
    5. @SpringBootTest
    6. public class HttpRequestTest {
    7. @Autowired
    8. private HttpRequest httpRequest;
    9. @Test
    10. public void getResponse(){
    11. httpRequest.getResponse();
    12. }
    13. }

    输出结果

    time: 1
    time: 2
    time: 3
    errorHandler

    以上就是SpringBoot整合Retry如何实现错误重试的详细内容,更多关于SpringBoot整合Retry如何实现错误重试的资料请关注九品源码其它相关文章!