Spring Retry实现接口或者方法重试调用

devtools/2025/1/23 22:33:49/

背景

调用外部系统或者调用一些方法失败的时候,我们需要有个重试机制,保证代码的健壮性。如果直接用while和变量重试,比较繁琐

使用while实现重试,比较繁琐

java">public class RetryExample {public static void main(String[] args) {int maxRetries = 3; // 最大重试次数int retryCount = 0;boolean success = false;while (retryCount < maxRetries && !success) {try {// 调用外部接口success = callExternalApi();if (success) {System.out.println("调用成功!");} else {System.out.println("调用失败,准备重试...");}} catch (Exception e) {System.out.println("调用异常: " + e.getMessage());} finally {retryCount++;}}if (!success) {System.out.println("重试次数用尽,调用失败!");}}private static boolean callExternalApi() throws Exception {// 模拟调用外部接口double random = Math.random();if (random > 0.5) {return true; // 模拟成功} else {throw new Exception("接口调用失败"); // 模拟失败}}
}

使用Spring Retry实现重试

如果你的项目是基于 Spring 的,可以使用 Spring Retry 库来实现重试机制。

添加依赖

在 pom.xml 中添加 Spring Retry 依赖:

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.20</version>
</dependency>

启用重试机制

在 Spring Boot 启动类上添加 @EnableRetry 注解:

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

使用 @Retryable 注解

在需要重试的方法上添加 @Retryable 注解:

java">import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class ExternalApiService {@Retryable(value = {Exception.class}, // 重试的异常类型maxAttempts = 3, // 最大重试次数backoff = @Backoff(delay = 1000) // 重试间隔时间(毫秒))public boolean callExternalApi() throws Exception {// 模拟调用外部接口double random = Math.random();if (random > 0.5) {return true; // 模拟成功} else {throw new Exception("接口调用失败"); // 模拟失败}}
}

调用服务

在需要的地方注入 ExternalApiService 并调用:

java">@Autowired
private ExternalApiService externalApiService;public void doSomething() {try {boolean result = externalApiService.callExternalApi();System.out.println("调用结果: " + result);} catch (Exception e) {System.out.println("重试次数用尽,调用失败: " + e.getMessage());}
}


http://www.ppmy.cn/devtools/152976.html

相关文章

我谈概率论与数理统计的知识体系

学习概率统计二十多年后&#xff0c;在廖老师的指导下&#xff0c;终于明白各章之间的关系。本来就是一条线两个分支&#xff0c;脉络很清晰。 分支一&#xff1a;从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量&#xff1a;为了进行定量的数学处理&#xf…

epoll 的边缘触发(Edge Triggered)与水平触发(Level Triggered)

文章目录 epoll的边缘触发&#xff08;Edge Triggered&#xff09;与水平触发&#xff08;Level Triggered&#xff09;边缘触发&#xff08;Edge Triggered, ET&#xff09;特点适用场景示例 水平触发&#xff08;Level Triggered, LT&#xff09;特点适用场景示例 边缘触发 v…

深入理解 Spring 的 Lazy Loading:原理、实现与应用场景

延迟加载&#xff08;Lazy Loading&#xff09;是 Spring 容器管理 Bean 的一种策略&#xff0c;指 只有在需要时&#xff08;调用 getBean() 方法获取 Bean 时&#xff09;才会实例化该 Bean。这是 Spring 提供的一种优化机制&#xff0c;用于提高启动效率和降低资源占用。 1.…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

HTTPS的加密原理

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一个安全的 HTTP 协议&#xff0c;结合了 SSL/TLS 协议来提供数据加密、身份验证和数据完整性保护。其核心加密原理可以分为以下几个步骤&#xff1a; 对称加密和非对称加密 HTTPS 使用了对称加密和非对称…

Java学习,List移动元素

Java实现List中元素的循环移动&#xff08;即将列表中的元素向右或向左移动指定数量的位置&#xff09;&#xff0c;可以使用多种方法。 List元素移动指定位置&#xff1a; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class…

Ardupilot开源无人机之Geek SDK进展2024-2025

Ardupilot开源无人机之Geek SDK进展2024-2025 1. 源由2. 状态3. TODO3.1 【进行中】跟踪目标框3.2 【暂停】onnxruntime版本3.3 【完成】CUDA 11.8版本3.4 【完成】pytorch v2.5.1版本 - Jetpack53.5 【未开始】Inference性能3.6 【未开始】特定目标集Training 4. Extra-Work4.…

Django学习笔记(启动项目)-03

Django学习笔记(启动项目)-03 1、在urls文件中配置一个路由url 2、在views文件中创建视图函数 3、启动项目测试结果 # 输入项目启动命令 python manage.py runserver4、创建HTML模版和静态文件 1、在templates文件夹中创建一个html 2、创建url路由与视图函数 3、测试效果 4、…