前言
作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端。但你不能保证所有的事情一直都很顺利。像有些第三方API,偶尔会出现超时。此时,我们要重试几次,这取决于你的重试策略。
下面举一个我在日常开发中多次看到的例子:
public interface OutSource {
List;
}
@Service
public class OutSourceImpl implements OutSource {
static Random random = new Random();
@Override
public List{
//mock failure
if (random.nextInt(2) == 1)
throw new TimeOutException();
return List.of(1, 2, 3);
}
}
@Slf4j
@Service
public class ManuallyRetryService {
@Autowired
private OutSource outSource;
public List{
log.info("trigger time:{}", retryTimes);
if (retryTimes > 3) {
return List.of();
}
try {
List
看看上面这段代码,我认为它可以正常工作,当retryTimes达到4时,无论如何我们都会得到最终结果。但是你觉得写的好吗?优雅吗?下面我来介绍Spring中的一个组件:spring-retry,我们不妨来试一试。
Spring-Retry介绍使用
spring-retry是Spring中的提供的一个重试框架,提供了注解的方式,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。
安装依赖
- 如果你的是gradle应用,引入下面的依赖
implementation 'org.springframework.boot:spring-boot-starter-aop''org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.retry:spring-retry'
- 如果你的项目使用的是maven项目,引入下面的依赖
<dependency>
<groupId>org.springframework.retry<span class="hljs-name"groupId>
<artifactId>spring-retry<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
<dependency>
<groupId>org.springframework.boot<span class="hljs-name"groupId>
<artifactId>spring-boot-starter-aop<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
启用重试功能
添加@EnableRetry注解在入口的类上从而启用功能。
@SpringBootApplication
//看过来
@EnableRetry
public class TestSpringApplication {
public static void main(String[] args) {
SpringApplication.run(TestSpringApplication.class, args);
}
}
应用
我们以前面的为例,看看怎么使用,如下面的代码:
public interface OutSource {
List;
}
@Service
public class OutSourceImpl implements OutSource {
static Random random = new Random();
@Override
public List{
//mock failure will throw an exception every time
throw new TimeOutException();
}
}
@Slf4j
@Service
public class RetryableService {
@Autowired
private OutSource outSource;
// 看这里
@Retryable(value = {TimeOutException.class}, maxAttempts = 3)
public List{
log.info("trigger timestamp:{}", System.currentTimeMillis() / 1000);
List
- 关键在于
Service层中的实现类中添加了@Retryable注解,实现了重试, 指定value是TimeOutException异常会进行重试,最大重试maxAttempts3次。
验证
这一次,当我们访问http://localhost:8080/retryable时,我们将看到浏览器上的结果失败。然后在你的终端上看到:
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236840
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236841
INFO 66776 --- [nio-9997-exec-1] c.m.testspring.service.RetryableService : trigger timestamp:1668236842
ERROR 66776 --- [nio-9997-exec-1] c.m.t.controller.RetryTestController : retryable final exception
总结
本文分享了spring-retry重试框架最基础的使用,可以无侵入业务代码进行重试。关于spring-retry更多的使用建议可以自己去官网https://github.com/spring-projects/spring-retry 探索。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
API
+关注
关注
2文章
2476浏览量
67022 -
数据库
+关注
关注
7文章
4083浏览量
68538 -
spring
+关注
关注
0文章
341浏览量
16053 -
SpringBoot
+关注
关注
0文章
178浏览量
712
发布评论请先 登录
相关推荐
热点推荐
如何在LabVIEW中嵌入第三方软件界面
如何把第三方软件的界面嵌入到labview中,并且能够在LabVIEW的前面板中对第三方软件进行操作。LabVIEW中有Active用于IE
发表于 04-27 23:06
LabVIEW与第三方软件交互问题
现在做一个软件,就是通过LabVIEW去与第三方软件进行交互操作!已经通过百度找到了利用user32.dll调用FindWindowA与PostMessage去实现对计算器,找了多方资料也没有找到解决办法。想做一个软件就是对图片2中
发表于 12-26 17:13
国内知名第三方检测认证机构排名
的检测机构介入,成熟的第三方检测机构介入商品检测在十九世纪中叶已经很普遍了,并成为一种自觉的商业行为。目前中国已经成为了全球贸易大国,经济实力跃居世界第二,强劲的对外贸易增长态势促进了检测行业的不断
发表于 07-19 16:57
关于LabVIEW调用第三方exe,如何去控制第三方exe按钮的问题
我想调用第三方的exe,但并没有给出任何接口,就单单一个exe程序,通过查资料得出可以用window自带的user32.dll可以控制第三方的软件,通过FindWindowA函数找到该软件句柄,通过
发表于 08-12 16:37
头文件中包含第三方文件
macrocmake如果源文件(例如 CPP)中包含第三方头文件,但是头文件(例如 hpp)中不包含该第三方文件头,采用 PRIVATE。如果源文件和头文件中都包含该
发表于 08-18 08:10
鸿蒙开源第三方组件资料合集
1、鸿蒙开源第三方组件——日志工具组件Timber_ohosTimber_ohos是一个带有小型可扩展API的日志工具组件,它可以给开发者提供统一的API接口,来记录不同类型的日志,帮助开发者管理
发表于 03-23 09:53
在Framework下调用第三方的C++算法库
我这里是JNI调用一个语音处理库,这些库厂商会以非开源的so库文件形式提供。JNI在编译时需要依赖它,所以需要先预编译安装第三方库。解决方法:在同一个Android.mk中编写就行:L
发表于 11-24 17:37
鸿蒙开发中怎么引入第三方库
多个 API 外也是支持组件库的调用的,那么鸿蒙应用开发是如何与第三方库衔接的呢? 加载一张图片是每个应用所需的功能,在 Android 平台提供的有 Glide、ImageLoad
调用第三方 API 接口会遇到哪些问题
了 11、接口时好时坏 12、文档和接口逻辑不一致 13、欠费了 前言 在实际工作中,我们经常需要在项目中调用第三方API接口,获取数据
谷歌开放ZenDeviceEffects API,助第三方应用实现睡前屏幕管理
据报道,谷歌近日在安卓 15 开发者预览版 2 中推出了全新 ZenDeviceEffects API,允许第三方应用访问数字健康的就寝模式功能。
如何集成第三方支付API到电商网站
在电商网站中,集成第三方支付API是确保交易安全、提升用户体验的关键步骤。本文将逐步指导您完成整个流程,从选择支付提供商到上线后的监控。文章结构清晰,包含代码示例和实用建议,帮助您
在SpringBoot中重试调用第三方API教程
评论