springboot 整合retry(重试机制) - 简书

标签: | 发表时间:2019-10-26 21:28 | 作者:
出处:https://www.jianshu.com

当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的实例。

写一个简单的demo,加入依赖:

    <dependencies>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
         <groupId>org.springframework.retry</groupId>
         <artifactId>spring-retry</artifactId>
     </dependency>
     <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
     </dependency>
</dependencies>

在主类上加上 @EnableRetry注解,表示启用重试机制。

    @SpringBootApplication
@EnableRetry
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

定义一个简单的controller层:

    @RestController
public class HelloController {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private PayService payService;

    @GetMapping("/createOrder")
    public String createOrder(@RequestParam int num) throws Exception{
        int remainingnum = payService.minGoodsnum(num == 0 ? 1: num);
        logger.info("剩余的数量==="+remainingnum);
        return "库库存成功";
    }

}

在controller中调用减库存的service接口,

    @Service
public class PayService {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private final int totalNum = 100000;


    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public int minGoodsnum(int num) throws Exception{
        logger.info("minGoodsnum开始"+ LocalTime.now());
        if(num <= 0){
            throw new Exception("数量不对");
        }
        logger.info("minGoodsnum执行结束");
        return totalNum - num;
    }
}

在minGoodsnum方法上加上 @Retryable注解, value值表示当哪些异常的时候触发重试, maxAttempts表示最大重试次数默认为3, delay表示重试的延迟时间, multiplier表示上一次延时时间是这一次的倍数。

测试:

图片.png
图片.png

重试三次抛出异常。

使用 @Recover注解,当重试次数达到设置的次数的时候,还是失败抛出异常,执行的回调函数。

关于 @Recover注解

图片.png

和minGoodsnum定义在一个类中

    @Recover
public int recover(Exception e){
        logger.warn("减库存失败!!!");
        //记日志到数据库
        return totalNum;
}

重试测试一下,

图片.png

感觉意义不大,重试失败的时候应该还是要抛出异常的,在上层进行catch记录日志,当然也有特殊的场景适用。

相关 [springboot retry] 推荐:

springboot 整合retry(重试机制) - 简书

- -
当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的实例. 写一个简单的demo,加入依赖:. @EnableRetry注解,表示启用重试机制. 定义一个简单的controller层:.

Spring-Retry重试实现原理 | Alben's home

- -
Spring实现了一套重试机制,功能简单实用. 本文将讲述如何使用Spring Retry的及其重试机制的实现原理. Spring实现了一套重试机制,功能简单实用. Spring Retry是从Spring Batch独立出来的一个功能,已经广泛应用于Spring Batch,Spring Integration, Spring for Apache Hadoop等Spring项目.

SpringBoot的事务管理

- - ImportNew
Springboot内部提供的事务管理器是根据autoconfigure来进行决定的. 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后(之前我们分析过 springboot的自动化配置原理). Springboot会构造一个JpaTransactionManager这个事务管理器.

springboot aop日志记录

- - 编程语言 - ITeye博客
一、POM增加AOP JAR包. 三、SysAspect类. 注:@annotation(cn.com.hfai.controller.system.Logweb) 一定要指定Logweb类. 四、在Controller类的方法之上加上注解 @Logweb 即可. 注:这个只是打印在控制台上,若想放到数据库中,则需要增加操作数据库的业务代码.

springboot集成shiro 实现权限控制

- - CSDN博客编程语言推荐文章
apache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,springboot本身是提供了对security的支持,毕竟是自家的东西. springboot暂时没有集成shiro,这得自己配. 本文实现从数据库读取用户信息,获取当前用户的权限或角色,通过配置文件过滤用户的角色或权限.

让SpringBoot启动更快一点

- - ImportNew
这是 2018 Spring One Platform 中的一场会议. 看完会议视频,我自己动手试了一下. 还没有观看视频的朋友推荐看一下,非常有意思. ↓我使用的是 OpenJDK 11. ❯ java --version openjdk 11.0.1 2018-10-16 OpenJDK Runtime Environment 18.9 (build 11.0.1+13) OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode).

基于springboot的freemarker创建指定格式的word文档

- - 互联网 - ITeye博客
       在web或其他应用中,经常我们需要导出或者预览word文档,比较实际的例子有招聘网站上预览或者导出个人简历,使用POI导出excel会非常的方便,但是如果想导出word,由于其格式控制非常复杂,故而使用POI将会非常麻烦,而FreeMarker则可以较好的解决这个问题;并且,根据FreeMarker的实现原理,预览word也会变得非常简单.

(转)正确、安全地停止SpringBoot应用

- - jackyrong
Spring Boot,作为Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物,它能帮助我们很快捷的创建出独立运行、产品级别的基于Spring框架的应用,大部分Spring Boot应用只需要非常少的配置就可以快速运行起来,是一个与微服务(MicroServices)相当契合的微框架.

用JWT技术为SpringBoot的API增加授权保护 – springcamp

- -
示例 https://github.com/qihaiyan/jwt-boot-auth. 用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的. 现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能够访问API.

springboot使用jasypt对的datasource密码加密

- - 开源软件 - ITeye博客
2.配置加密参数(可以理解为加密的salt). password: BdaObXaELAA #(或者用123456).   cmd运行下面的,将其中jar的位置改变,好友password是项目配置中配置的jasypt.encryptor.password=BdaObXaELAA,input是原始的密码.