SpringBoot中使用SpringRetry实现重试机制(重试调用第三方API)

场景

Springboot+FastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文):

Springboot+FastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)_fastjson 发送http请求 接收实体,出现日期转换异常-CSDN博客

在调用第三方接口时,可能会出现因为网络波动等原因导致的接口连接超时等短暂的问题。

如何在调用时添加重试机制,可以通过添加注解的方式给指定的方法配置指定的策略执行重试机制。

Spring Retry

Spring Retry提供了自动重新调用失败的操作的功能。这在错误可能是暂时的(例如瞬时网络故障)的情况下很有用。

GitHub - spring-projects/spring-retry

注:

博客:
霸道流氓气质-CSDN博客

实现

1、引入项目依赖

        <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

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

3、新建接口,用来调用第三方接口

public interface IRetryService {String getThirdApiData();}

4、接口实现

​
import cn.hutool.http.HttpRequest;
import com.ruoyi.system.service.IRetryService;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class RetryServiceImpl implements IRetryService {//value :针对指定抛出的异常类型,进行重试,这里指定的是Exception//maxAttempts :配置最大重试次数,这里配置为10次(包含第一次和最后一次)//delay: 第一次重试延迟间隔,这里配置的是2s//multiplier :每次重试时间间隔是前一次几倍,这里是1.5倍@Override@Retryable(value = Exception.class, maxAttempts = 10, backoff = @Backoff(delay = 2000,multiplier = 1.5))public String getThirdApiData() {System.out.println("调用一次");return HttpRequest.get("http://127.0.0.1:4523/m1/2858210-0-default/testFastJson").timeout(4000).execute().body();}@Recoverpublic String recover(Exception e){return "请求失败";}
}​

其中在需要重试的方法上添加注解@Retryable,并配置重试策略

value :针对指定抛出的异常类型,进行重试,这里指定的是Exception

maxAttempts :配置最大重试次数,这里配置为10次(包含第一次和最后一次)

delay: 第一次重试延迟间隔,这里配置的是2s

multiplier :每次重试时间间隔是前一次几倍,这里是1.5倍

注解@Recover用来配置所有重试都失败后的回调方法。

5、编写单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SpringRetryTest {@Autowiredprivate IRetryService iRetryService;@Testpublic void getThirdApiDataTest() {try {String thirdApiData = iRetryService.getThirdApiData();System.out.println(thirdApiData);} catch (Exception exception) {exception.printStackTrace();}}
}

6、首先将重试次数设置为5次,运行测试结果

当接口一直不通时

再将重试次数设置为10次,并在重试过程中将接口打开

7、@Retryable注解还可指定重试指定类型的异常

    @Retryable(value = { RestClientException.class, TimeoutException.class },maxAttempts = 3,backoff = @Backoff(delay = 1000, multiplier = 2))

方法会在发生RestClientException或TimeoutException异常时进行重试。

还可排除指定类型的异常

    @Retryable(value = { RestClientException.class },maxAttempts = 3,backoff = @Backoff(delay = 1000, multiplier = 2),exclude = { TimeoutException.class })

方法会在发生RestClientException异常时进行重试,但排除了TimeoutException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fluids —— Whitewater (SOP)

目录 Whitewater Lifecycle Workflow Whitewater source Deformation sources Visualizing whitewater Whitewater solver Wind Foam erosion Repellants Whitewater postprocess 基于SOP的白水是对SOP FLIP工作流的增强&#xff1b;该系统与规模无关&#xff0c;无需…

XCTF:CatCatCat[WriteUP]

从题目中下载到一张图片和一个txt文件 编码的开头是&#xff1a;U2FsdGVkX1所以是rabbit加密 尝试使用密钥&#xff1a;91 密码不对&#xff0c;无法解密所以从图片下手 使用010Editor搜索图片文本内容 尝试搜索password、flag等敏感字体 直接拿到rabbit解密需要的密钥是&am…

facebook广告的基础知识与类型

Facebook广告是在Facebook平台上展示的一种数字广告形式&#xff0c;它允许广告主通过定位特定的受众群体来推广他们的产品、服务或品牌。以下是一些关于Facebook广告的基础知识&#xff1a; 支持Facebook广告的卡、556150、532959&#xff0c;点击获取 广告形式&#xff1a; …

【开源项目】轻量元数据管理解决方案——Marquez

大家好&#xff0c;我是独孤风。 又到了本周的开源项目推荐。最近推荐的元数据管理项目很多&#xff0c;但是很多元数据管理平台的功能复杂难用。 那么有没有轻量一点的元数据管理项目呢&#xff1f; 今天为大家推荐的开源项目&#xff0c;就是一个轻量级的元数据管理工具。虽然…

STL之list

目录 list定义和结构 list容器模板接受两个参数&#xff1a; list容器的特点 双向性 动态大小 不连续存储 实例 代码输出 需要注意的点 list常用函数 代码示例 list定义和结构 list的使用频率不高&#xff0c;在做题时极少遇到需要使用list的情景。 list是一种双向…

SpringBoot用MultipartFile.transferTo传递相对路径的问题

问题描述&#xff1a; 打算给自己的项目添加一个上传文件保存功能&#xff0c;于是我使用MultipartFile.transferTo()来完成这个功能&#xff0c;由于我的项目要部署到服务器&#xff0c;所以我使用了相对路径把上传的文件保存到当前项目的工作目录下&#xff0c;但是报错了&am…

软件测试|探索Python中获取最高数值的几种方法

前言 在数据分析、统计和编程领域&#xff0c;经常会遇到需要从一组数值中找出最高数值的情况。Python 作为一门功能丰富的编程语言&#xff0c;提供了多种方法来实现这一目标。在本文中&#xff0c;我们将探索几种获取最高数值的方法&#xff0c;帮助大家在不同情况下选择最适…

X3En【禾川】

地址&#xff1a; P9-00 波特率&#xff1a;【005】 故障码&#xff1a;

使用python读取yaml文件数据

使用python读取yaml文件&#xff1a; yaml文件数据&#xff1a;data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…

0111qt

实现闹钟&#xff0c;并播报懒虫...~ daytest.pro: QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (th…

Spring Security介绍

一、Spring Security&#xff1a; 1、简介&#xff1a;Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。一般来说&#xff0c;Web 应用的安全性包括用户认证&#xff08;A…

基于SpringBoot的教学管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…