开发者

SpringBoot整合Retry实现错误重试过程逐步介绍

开发者 https://www.devze.com 2023-02-28 10:30 出处:网络 作者: 彭世瑜
目录引入依赖开启spring-retry使用重试注解@Retryable注解@Backoff注解测试参考引入依赖
目录
  • 引入依赖
  • 开启spring-retry
  • 使用重试注解
    • @Retryable注解
    • @Backoff注解
  • 测试
    • 参考

      引入依赖

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

      完整依赖pom.XML

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.7.7</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
          <groupId>com.example</groupId>
          <artifactId>demo</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <name>demo</name>
          <description>Demo project for Spring Boot</description>
          <properties>
              <Java.version>1.8</java.version>
          </properties>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-devtools</artifactId>
                  <scope>runtime</scope>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok<www.devze.com/artifactId>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <jsscope>test</scope>
              </dependency>
              <!-- spring-retry -->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-aop</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.retry</groupId>
                  <artifactId>spring-retry</artifactId>
              </dependency>
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <configuration>
                          <excludes>
                              <exclude>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok</artifactId>
                              </exclude>
                          </excludes>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>

      开启spring-retry

      启动类上增加注解 @EnableRetry

      package com.example.demo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.retry.annotation.EnableRetry;
      @EnableRetry
      @SpringBootApplication
      public class Application {
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }
      

      使用重试注解

      @Retryable注解

      • value,可重试的异常类型。含义同include。默认为空(如果excludes也为空,则重试所有异常)
      • include:可重试的异常类型。默认为空(如果excludes也为空,则php重试所有异常)
      • exclude:无需重试的异常类型。默认为空(如果includes也为空,则重试所有异常)
      • maxAttempts:最大重试次数(包括第一次失败),默认为3次
      • backoff:重试等待策略,下面会在@Backoff中介绍
      • recover:表示重试次数到达最大重试次数后的回调方法

      @Backoff注解

      • delay,重试之间的等待时间(以毫秒为单位)
      • maxDelay,重试之间的最大等待时间(以毫秒为单位)
      • multiplier,指定延迟的倍数
      • delayExpression,重试之间的等待时间表达式
      • maxDelayExpression,重试之间的最大等待时间表达式
      • multiplierExpression,指定延迟的倍数表达式
      • random,随机指定延迟时间

      使用示例

      package com.example.demo.component;
      import org.springframework.retry.annotation.Recover;
      import org.springframework.retry.annotation.Retryable;
      import org.springframework.stereotype.Component;
      @Component
      public class HttpRequest {
         编程客栈 private int count = 0;
          /**
           * 模拟网络请求异常
           * @return
           */
          @Retryable(recover = "errorHandler")
          public String getResponse() {
              count++;
              System.out.println("time: " + count);
              if (count < 4) {
                  throw new RuntimeException("count: " + count);
              }
              return "success";
          }
          /**
           * 错误处理函数
           * 注意:需要返回 String,否则会抛出方法找不到异常
           * org.springframework.retry.ExhaustedRetryException: Cannot locate recovery method
           *
           * @param e
           * @return
           */
          @Recover
          public String errorHandler(RuntimeException e) {
              System.out.println("errorHandler");
              return "ok";
          }
      }

      测试

      package com.example.demo.component;
      import org.junit.jupiter.api.Test;
      import org.spri开发者_C教程ngframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.co编程客栈ntext.SpringBootTest;
      @SpringBootTest
      public class HttpRequestTest {
          @Autowired
          private HttpRequest httpRequest;
          @Test
          public void getResponse(){
              httpRequest.getResponse();
          }
      }
      

      输出结果

      time: 1

      time: 2

      time: 3

      errorHandler

      参考

      SpringBoot 中使用 spring-retry 轻松解决重试

      到此这篇关于SpringBoot整合Retry实现错误重试过程逐步介绍的文章就介绍到这了,更多相关SpringBoot Retry错误重试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号