0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在SpringBoot中重试调用第三方API教程

jf_78858299 来源:JAVA旭阳 作者:JAVA旭阳 2023-05-11 10:43 次阅读

前言

作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端。但你不能保证所有的事情一直都很顺利。像有些第三方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
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61991
  • 数据库
    +关注

    关注

    7

    文章

    3799

    浏览量

    64379
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14341
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    177
收藏 人收藏

    评论

    相关推荐

    如何把第三方库加到PROTEUS

    新手求教,弱弱的问下,下了一个第三方库,说是要先安装,再添加路径,可是我下来的第三方库没有看到安装文件啊。还望指教如何添加!
    发表于 06-15 22:32

    如何在LabVIEW嵌入第三方软件界面

    如何把第三方软件的界面嵌入到labview,并且能够LabVIEW的前面板第三方软件进行操作。LabVIEW中有Active用于IE
    发表于 04-27 23:06

    labview 通过API调用第三方软件 无法通过ID获取窗口元素的句柄

    labview 通过API调用第三方软件无法通过ID获取窗口元素的句柄
    发表于 12-11 17:41

    第三方dll调用问题!!!

    第三方dll,没有.h,labview怎么实现调用,dll可以用VS打开,类库说明也有
    发表于 05-11 09:14

    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

    银行和第三方支付:恋爱进行时

    银行和第三方支付:恋爱进行时   北京2010年1月8日电  -- 从第三方支付诞生之时起,银行与第三方支付之间的竞合关系
    发表于 01-09 08:08 665次阅读

    鸿蒙开发怎么引入第三方

    多个 API 外也是支持组件库的调用的,那么鸿蒙应用开发是如何与第三方库衔接的呢? 加载一张图片是每个应用所需的功能, Android 平台提供的有 Glide、ImageLoad
    的头像 发表于 10-11 14:11 4067次阅读

    调用第三方 API 接口会遇到哪些问题

    了 11、接口时好时坏 12、文档和接口逻辑不一致 13、欠费了   前言 实际工作,我们经常需要在项目中调用第三方API接口,获取数据
    的头像 发表于 05-29 14:31 1502次阅读

    调用第三方API接口会遇到哪些问题?如何解决?

    实际工作,我们经常需要在项目中调用第三方API接口,获取数据,或者上报数据,进行数据交换和通信。
    的头像 发表于 11-30 11:05 2257次阅读
    <b class='flag-5'>调用</b><b class='flag-5'>第三方</b><b class='flag-5'>API</b>接口会遇到哪些问题?如何解决?

    谷歌开放ZenDeviceEffects API,助第三方应用实现睡前屏幕管理

    据报道,谷歌近日安卓 15 开发者预览版 2 推出了全新 ZenDeviceEffects API,允许第三方应用访问数字健康的就寝模式功能。
    的头像 发表于 05-08 16:41 482次阅读