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之SSM中bean相关知识汇总案例讲解

    Java之SSM中bean相关知识汇总案例讲解

    这篇文章主要介绍了Java之SSM中bean相关知识汇总案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • eclipse springboot工程打war包方法及再Tomcat中运行的方法

    eclipse springboot工程打war包方法及再Tomcat中运行的方法

    这篇文章主要介绍了eclipse springboot工程打war包方法及再Tomcat中运行的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • SpringBoot监控SQL运行情况的流程步骤

    SpringBoot监控SQL运行情况的流程步骤

    Druid是Java语言中最好的数据库连接池,虽然 HikariCP 的速度稍快,但是,Druid能够提供强大的监控和扩展功能 ,也是阿里巴巴的开源项目,本文给大家介绍了SpringBoot监控SQL运行情况的流程步骤,需要的朋友可以参考下
    2024-03-03
  • SpringMVC中日期格式的转换

    SpringMVC中日期格式的转换

    本文主要介绍了SpringMVC中日期格式转换的相关知识:用来解决日期提交转换异常的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • kafka与storm集群环境的安装步骤详解

    kafka与storm集群环境的安装步骤详解

    这篇文章主要给大家介绍了关于kafka与storm集群环境安装步骤的相关资料,两者并不是一定联系的,写在一起主要是因为两个都是有zookeeper管理的,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • hibernate多表操作实例代码

    hibernate多表操作实例代码

    这篇文章主要介绍了hibernate多表操作实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 如何从官网下载Hibernate jar包的方法示例

    如何从官网下载Hibernate jar包的方法示例

    这篇文章主要介绍了如何从官网下载Hibernate jar包的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 一文搞清楚Java中Comparable和Comparator的区别

    一文搞清楚Java中Comparable和Comparator的区别

    Java中的Comparable和Comparator都是用于集合排序的接口,但它们有明显的区别,文中通过一些实例代码详细介绍了Java中Comparable和Comparator的区别,感兴趣的同学跟着小编一起学习吧
    2023-05-05
  • SpringBoot之spring.factories的使用方式

    SpringBoot之spring.factories的使用方式

    这篇文章主要介绍了SpringBoot之spring.factories的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java运算符从见过到掌握下

    Java运算符从见过到掌握下

    计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量,本篇对大家的学习或工作具有一定的价值,紧接上篇,需要的朋友可以参考下
    2021-09-09

最新评论