欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring-retry简单使用方法

程序员文章站 2023-11-04 20:47:16
在分布式系统中,为了保证数据分布式事务的强一致性,大家在调用rpc接口或者发送mq时,针对可能会出现网络抖动请求超时情况采取一下重试操作。大家用的最多的重试方式就是mq了,...

在分布式系统中,为了保证数据分布式事务的强一致性,大家在调用rpc接口或者发送mq时,针对可能会出现网络抖动请求超时情况采取一下重试操作。大家用的最多的重试方式就是mq了,但是如果你的项目中没有引入mq,那就不方便了,本文主要介绍一下如何使用spring retry实现重试操作。

1. 添加maven依赖

<dependency> 
  <groupid>org.springframework.retry</groupid> 
  <artifactid>spring-retry</artifactid> 
  <version>1.1.2.release</version> 
</dependency> 
<dependency> 
  <groupid>org.aspectj</groupid> 
  <artifactid>aspectjweaver</artifactid> 
  <version>1.5.4</version> 
</dependency> 

2. 在启动里添加重试配置

@springbootapplication 
@enableretry 
public class application { 
 
  public static void main(string[] args) { 
    springapplication.run(application.class, args); 
  } 
 
} 

3. 编写service

@service 
public class remoteservice { 
 
  private static final logger logger = loggerfactory.getlogger(testcontroller.class); 
 
  @retryable(value= {businessexception.class},maxattempts = 3,backoff = @backoff(delay = 5000l,multiplier = 2)) 
  public void call() throws exception { 
    logger.info("do something..."); 
    throw new businessexception("rpc调用异常"); 
  } 
  @recover 
  public void recover(businessexception e) { 
    logger.info(" --------------------------- "); 
    logger.info(e.getmessage()); 
  } 
} 

4. 编写controller

@restcontroller 
@requestmapping("/test") 
public class testcontroller { 
 
  private static final logger logger = loggerfactory.getlogger(testcontroller.class); 
 
  @autowired 
  private remoteservice remoteservice; 
 
  @requestmapping("/test") 
  public string login() throws exception { 
    remoteservice.call(); 
    return string.valueof("11"); 
  } 

5. 访问http://localhost:8080/test/test

6. 测试日志

2017-07-25 19:28:07 [info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call(remoteservice.java:19)] do something... 
2017-07-25 19:28:12 [info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call(remoteservice.java:19)] do something... 
2017-07-25 19:28:22 [info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call(remoteservice.java:19)] do something... 
2017-07-25 19:28:22 [info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.recover(remoteservice.java:24)]  ---------------------------   
2017-07-25 19:28:22 [info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.recover(remoteservice.java:25)] rpc调用异常 

7. 相关配置说明

@enableretry能否重试当proxytargetclass属性为true时,使用cglib代理。默认使用标准java注解。在spring boot中此参数写在程序入口即可。

@retryable 标注此注解的方法在发生异常时会进行重试
            value:指定处理的异常类

            include:指定处理的异常类和value一样,默认为空,当exclude也为空时,默认所有异常

            exclude:指定异常不处理,默认空,当include也为空时,默认所有异常

            maxattempts:最大重试次数。默认3次

            backoff: 重试等待策略。默认使用@backoff注解

@backoff 重试等待策略
            不设置参数时,默认使用fixedbackoffpolicy(指定等待时间),重试等待1000ms

            设置delay,使用fixedbackoffpolicy(指定等待时间),重试等待填写的时间

            设置delay和maxdealy时,重试等待在这两个值之间均态分布

            设置delay、maxdealy、multiplier,使用 exponentialbackoffpolicy(指数级重试间隔的实现 ),multiplier即指定延迟倍数,比如delay=5000l,multiplier=2,则第一次重试为5秒,第二次为10秒,第三次为20秒……

@recover 用于@retryable重试失败后处理方法,此注解注释的方法参数一定要是@retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

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