Spring boot使用spring retry重试机制的方法示例

 更新时间:2020年01月03日 10:28:21   作者:java_small_ant  
这篇文章主要介绍了Spring boot使用spring retry重试机制的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

当我们调用接口的时候由于网络原因可能失败,再尝试就成功了,这就是重试机制。非幂等的情况下要小心使用重试。

tips:幂等性

HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

注解方式使用Spring Retry

(一)Maven依赖

<!-- 重试机制 -->
<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
  <version>1.2.4.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.4</version>
</dependency>

(二)配置类添加注解 @EnableRetry

@EnableRetry
@Configuration
public class RetryConfiguration {

}

(三)Service方法编写

@Retryable注解:

value: 抛出指定异常才会重试

include:和value一样,默认为空,当exclude也为空时,默认所以异常

exclude:指定不处理的异常

maxAttempts:最大重试次数,默认3次

backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L;multiplier(指定延迟倍数)

@Recover注解:

当重试达到指定次数时候该注解的方法将被回调

发生的异常类型需要和@Recover注解的参数一致

@Retryable注解的方法不能有返回值,不然@Recover注解的方法无效

@Service
public class RetryService {

 private Logger logger = LoggerFactory.getLogger(RetryService.class);

 @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 2))
 public void devide(double a, double b){
   logger.info("开始进行除法运算");
   if (b == 0) {
     throw new RuntimeException();
   }
   logger.info("{} / {} = {}", a, b, a / b);
 }

 @Recover
 public void recover() {
   logger.error("被除数不能为0");
 }

}

(四)测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class BootdemoApplicationTests {

  @Autowired
  private RetryService retryService;

  private Logger logger = LoggerFactory.getLogger(BootdemoApplication.class);

  @Test
  public void retryTest() {
    //int count = retryService.retry(-1);
    retryService.retry(-1);
    //logger.info("库存为:" + count);
  }
}

注意事项

@Retryable不能在本类使用,不然不会生效。如果直接调用execute重试机制将不会生效,调用devide则重试生效。

public void execute(double a, double b) throws DevideException {
    devide(a, b);
  }

  @Retryable(value = DevideException.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 2))
  public void devide(double a, double b) throws DevideException {
    logger.info("开始进行除法运算");
    if (b == 0) {
      throw new DevideException("被除数不能为0");
    }
    logger.info("{} / {} = {}", a, b, a / b);
  }

使用@Retryable不能使用try catch捕获异常为简单

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于Java中的 JSP 详解

    关于Java中的 JSP 详解

    JSP 代表 Java 服务器页面。它是一种在应用服务器端使用的编程工具。JSP 基本上用于支持平台–独立和动态的方法来构建 Web 依赖的应用程序。JSP 页面类似于 ASP 页面,因为它们是在服务器上编译的,而不是在用户的 Web 浏览器上进行编译。下面来看看文章的详细介绍内容
    2021-11-11
  • Spring中的事务传播行为示例详解

    Spring中的事务传播行为示例详解

    这篇文章主要给大家介绍了关于Spring中事务传播行为的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Java interceptor拦截器的方法

    Java interceptor拦截器的方法

    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可使开发者在一个Action执行的先后执行一段代码,也能够在一个Action,接下来通过本文给大家介绍Java interceptor拦截器的方法,感兴趣的朋友一起看看吧
    2022-01-01
  • SpringBoot统一功能处理实现的全过程

    SpringBoot统一功能处理实现的全过程

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,下面这篇文章主要给大家介绍了关于SpringBoot统一功能处理实现的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 详解spring-cloud与netflixEureka整合(注册中心)

    详解spring-cloud与netflixEureka整合(注册中心)

    这篇文章主要介绍了详解spring-cloud与netflixEureka整合(注册中心),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • JDK常用命令jps jinfo jstat的具体说明与示例

    JDK常用命令jps jinfo jstat的具体说明与示例

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jinfo、jstat等小巧的工具,本文章希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解
    2021-09-09
  • 浅谈servlet与jsp的关系

    浅谈servlet与jsp的关系

    本文主要介绍了servlet与jsp的相关知识,并总结出servlet与jsp之间的关系,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 关于批量插入或更新数据(MyBatis-plus框架)

    关于批量插入或更新数据(MyBatis-plus框架)

    这篇文章主要介绍了关于批量插入或更新数据(MyBatis-plus框架),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java用Cookie限制点赞次数(简版)

    Java用Cookie限制点赞次数(简版)

    最近做了一个项目,其中有项目需求是,要用cookie实现限制点赞次数,特此整理,把实现代码分享给大家供大家学习
    2016-02-02
  • 迪米特法则_动力节点Java学院整理

    迪米特法则_动力节点Java学院整理

    这篇文章主要介绍了迪米特法则,迪米特法则就是一个在类创建方法和属性时需要遵守的法则,有兴趣的可以了解一下
    2017-08-08

最新评论