SpringBoot如何整合spring-retry来实现接口请求重试
一、重试机制
由于网络不稳定或网络抖动经常会造成接口请求失败的情况,当我们再去尝试就成功了,这就是重试机制。
其主要目的就是要尽可能地提高请求成功的概率,但一般情况下,我们请求第一次失败,代码运行就抛出异常结束了,如果想再次请求可能还需要手工操作,这非常地不方便,可行性也不佳。因此,Spring框架提供了对重试机制支持,并且在Spring Cloud中可以与Hystrix结合使用,可以避免访问到已经不正常的实例。
二、重试机制要素
重试机制要素如下:
- 限制重试次数
- 每次重试的时间间隔
- 最终失败结果的报警或事物回滚
- 在特定失败异常事件情况下选择重试
三、重试机制注意事项
对于非幂等性的方法我们要慎用重试机制,可能会造成意料之外的后果。
所谓幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
四、SpringBoot整合spring-retry
下面我们就来看下,我们应该如何使用SpringBoot来整合spring-retry组件实现重试机制。
1)添加依赖
首先我们在SpringBoot项目中的pom.xml添加相关依赖,如下:
<!-- 重试相关依赖包 -->
<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>
2)添加@EnableRetry注解
在主启动类Application上添加@EnableRetry注解,实现对重试机制的支持
@SpringBootApplication
@EnableRetry
public class RetryApplication { public static void main(String[] args) { SpringApplication.run(RetryApplication.class, args);
} }
注意:@EnableRetry也可以使用在配置类、ServiceImpl类、方法上
3)添加@Retryable注解
我们针对需要实现重试的方法上添加@Retryable注解,使该方法可以实现重试,这里我列出ServiceImpl中的一个方法:
@Service
public class RetryServiceImpl implements RetryService { @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
public String testRetry() throws Exception { System.out.println("开始执行代码:"+ LocalTime.now());
int code = 0;
// 模拟一直失败
if(code == 0){
// 这里可以使自定义异常,@Retryable中value需与其一致
throw new Exception("代码执行异常");
}
System.out.println("代码执行成功");
return "success";
}
}
说明:@Retryable配置元数据情况:
value :针对指定抛出的异常类型,进行重试,这里指定的是Exception
maxAttempts :配置最大重试次数,这里配置为3次(包含第一次和最后一次)
delay: 第一次重试延迟间隔,这里配置的是2s
multiplier :每次重试时间间隔是前一次几倍,这里是1.5倍
4)Controller测试代码
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RetryService retryService; @GetMapping("/retry")
public String testRetry() throws Exception {
return retryService.testRetry();
}
}
5)发送请求
发送请求后,我们发现后台打印情况,确实重试了3次,并且在最后一次重试失败的情况下,才抛出异常,具体如下(可以注意下时间间隔):

6)补充:@Recover
一般情况下,我们重试最大设置的次数后,仍然失败抛出异常,我们会通过全局异常处理类进行统一处理,但是我们其实也可以自行处理,可以通过@Recover注解来实现,具体如下:
@Service
public class RetryServiceImpl implements RetryService { @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
public String testRetry() throws Exception { System.out.println("开始执行代码:"+ LocalTime.now());
int code = 0;
if(code == 0){
// 这里可以使自定义异常,@Retryable中value需与其一致
throw new Exception("代码执行异常");
}
System.out.println("代码执行成功");
return "success";
} /**
* 最终重试失败处理
* @param e
* @return
*/
@Recover
public String recover(Exception e){ System.out.println("代码执行重试后依旧失败");
return "fail";
}
}
注意:
1)@Recover的方法中的参数异常类型需要与重试方法中一致
2)该方法的返回值类型与重试方法保持一致
再次测试如下(发现不会再抛出异常):
本文首发于Java潘老师个人博客:SpringBoot整合spring-retry组件实现重试机制
SpringBoot如何整合spring-retry来实现接口请求重试的更多相关文章
- springboot+maven整合spring security
springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...
- SpringBoot学习(二)—— springboot快速整合spring security组件
Spring Security 简介 spring security的核心功能为认证(Authentication),授权(Authorization),即认证用户是否能访问该系统,和授权用户可以在系 ...
- spring aop实现拦截接口请求打印日志
在spring配置 1编写自己的注解类 2.编写注解解析类 3.配置spring aop代理 (下面我使用注解 如使用配置 配置切点即可,有两种代理默认jdk代理 设置true 为cglib代理) / ...
- 接口请求失败处理,重新请求并限制请求次数.自己封装搞定retry函数
最近开发一款小程序的时候想到一个问题,如果接口突然挂掉怎么办呢,于是乎想到一个解决办法.接口请求重试功能.并限制请求次数 用最新的async函数语法实现.代码简洁明了. 测试代码如下: functio ...
- Struts2整合Spring方法及原理
一. Struts 2框架整合Spring步骤 1. 复制文件.复制struts2-spring-plugin-x-x-x.jar和spring.jar到WEB-INF/lib目录下.其中的x对应 ...
- Spring Cloud Config Client 超时与重试
简介 有时客户端需要在 config server 无响应时进行重试,以给 config server 时间进行恢复.利用 spring 提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试 ...
- SpringBoot整合Spring Security
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Securi ...
- springBoot整合spring security实现权限管理(单体应用版)--筑基初期
写在前面 在前面的学习当中,我们对spring security有了一个小小的认识,接下来我们整合目前的主流框架springBoot,实现权限的管理. 在这之前,假定你已经了解了基于资源的权限管理模型 ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)
SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...
随机推荐
- 2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,...,L[25]对应y。 S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(
2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,-,L[25]对应y. S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(i- ...
- Golang接收者方法语法糖
1.概述 在<Golang常用语法糖>这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖. 在介绍Golang接收者方法语法糖前,先简单说下Go 语言 ...
- APRIL 2022-Explanation-Aware Experience Replay in Rule-Dense Environments
I. INTRODUCTION 解释是人类智能的关键机制,这种机制有可能提高RL代理在复杂环境中的表现 实现这一目标的一个核心设计挑战是将解释集成到计算表示中.即使在最小的规则集变化下,将规则集(或部 ...
- MySQL全面瓦解30:备份与恢复
合辑地址:MySQL全面瓦解 1 为什么需要数据库备份 灾难恢复:当发生数据灾难的时候,需要对损坏的数据进行恢复和还原 需求的变更或者回滚:当需求发生变更,或者需要回滚到之前的版本时,数据库备份也显得 ...
- ORM核心功能之导航属性- EFCore和 SqlSugar
导航属性 导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套 非常成熟的导航属性体系,本文不是 ...
- vivo 自研鲁班分布式 ID 服务实践
作者:vivo IT 平台团队- An Peng 本文介绍了什么是分布式ID,分布式ID的业务场景以及9种分布式ID的实现方式,同时基于vivo内部IT的业务场景,介绍了自研鲁班分布式ID服务的实践. ...
- prometheus描点原理
大家好,我是蓝胖子,关于prometheus的入门教程有很多,拿我之前学prometheus的经历来讲,看了很多教程,还是会对prometheus的描点以及背后的统计原理感到迷惑,所以今天我们就来分析 ...
- EtherCAT 转CCLINK网关连接三菱plc应用案例
EtherCAT 现场总线协议是由德国倍福公司在 2003 年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构. 捷米特JM-ECT-CCLK 是自主研发的一 ...
- Win10激活步骤、密钥key
统安装完毕后,首先以Win+R打开CMD命令行窗口,按下Win+X,选择命令提示符(管理员). Win10企业版 用户举例请依次输入: slmgr /ipk NPPR9-FWDCX-D2C8J-H87 ...
- elementui中deep的用法/deep/
在做第一个vue项目时遇到了一个问题,在使用elementui中的Drawer(抽屉组件时),想要修改Drawer的标题,尝试着修改title的样式,但没有效果,尝试了很多方法,最后用/deep/解决 ...