SpringBoot集成接口重试Retry

SpringBoot集成接口重试Retry

前言

在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作。然而,由于网络不稳定、第三方服务异常等原因,API调用可能会失败。为了提高系统的稳定性和可靠性,我们通常会考虑实现重试机制。

集成

1、引入pom坐标

java 复制代码
		<dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>

同时需要aop的依赖包:

java 复制代码
	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

启动类加注解:

java 复制代码
@EnableRetry

2、代码示例

2.1配置重试策略
java 复制代码
	@Override
    @Retryable(value = {RestClientException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000,multiplier = 2))
    public String callThirdPartyApi() {

        //调用第三方API接口逻辑

        return null;
    }

@Retryable注解标记了callThirdPartyApi方法,指定了当发生RestClientException异常时进行重试。

maxAttempts指定最大重试次数。

backoff指定了重试间隔的初始延迟和延迟倍数。

2.2降级处理
java 复制代码
	@Override
    @Retryable(value = {RestClientException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000,multiplier = 2))
    public String callThirdPartyApi() {

        //调用第三方API接口逻辑

        return null;
    }

    @Recover
    public String fallback(){
        
        //降级处理逻辑
        
        return null;
    }

@Recover注解标记了fallback方法,当callThirdPartyApi方法的重试次数达到上限时,将执行fallback方法中的降级逻辑。

2.3异步方法的重试及降级
java 复制代码
	@Async
  	@Retryable(value = {RestClientException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000,multiplier = 2))
    public CompletableFuture<String> callAsyncThirdPartyApi() {
        //调用第三方API接口逻辑
    }

    @Recover
    public CompletableFuture<String> fallback() {
        // 异步降级处理逻辑
    }
2.4异常分类与重试
java 复制代码
@Retryable(
        value = { RestClientException.class, TimeoutException.class },
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2)
    )
    public String callThirdPartyApi() {
        // 调用第三方API的逻辑
        // ...
    }

callThirdPartyApi方法会在发生RestClientExceptionTimeoutException异常时进行重试。

java 复制代码
@Retryable(
        value = { RestClientException.class },
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2),
        exclude = { TimeoutException.class }
    )
    public String callThirdPartyApi() {
        // 调用第三方API的逻辑
        // ...
    }

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

相关推荐
腻害兔11 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
Alan_69132 分钟前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金35 分钟前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
心念枕惊35 分钟前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
晚安code37 分钟前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘38 分钟前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试
大陈AI39 分钟前
Docker Compose 前后端部署踩坑实录:3 个坑让我的容器反复 Exit(1)
后端
长大198843 分钟前
MySQL 慢查询排查完整流程
后端
苏三说技术1 小时前
为什么越来越多人使用FastAPI?
后端
老孙讲技术2 小时前
业主半夜想看楼道监控,物业却说「去机房」?我用设备托管+轻应用,把小区摄像头嵌进了社区小程序
后端·物联网