接口请求失败?@Retryable(spring的重试机制)

在开发中遇到接口调用失败的情况,可以利用Spring的@Retryable注解进行重试操作。首先添加spring-retry和spring-aspects依赖,然后在启动类或配置类上启用重试机制,并在需要重试的方法上添加@Retryable注解,定义重试次数和间隔时间。当重试达到最大次数,可以使用@Recover注解定义回退方法进行异常处理。注意避免在方法内部直接调用重试方法导致重试失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发项目中,我们经常会使用到多个第三方接口来获取数据,那么当调用接口失败,导致获取不到数据时该如何处理?这时候就需要用到@Retryable注解了(spring提供的重试机制)

使用步骤:

1.添加依赖

 <dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
  </dependency>
  //因为Spring Retry是使用AOP实现,所以必须要有spring-aspects依赖
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
  </dependency>

2. 在启动类或者配置类或者需重试方法所在的类上添加注解@EnableRetry

启动类示例

@EnableRetry
@SpringBootApplication
public class Application { ... }

配置类示例

@EnableRetry
@Configuration
public class AppConfig { ... }

3. 在需要重试的方法上添加注解@Retryable,当方法发生指定异常时就会重试

@Service
public class DemoService {
	@Retryable(value={Exception.class},maxAttempts=3,backoff=@Backoff(value=3000,multiplier=1.5))
    public void call() throws Exception {
            throw new Exception("RPC调用异常");
    }
    @Recover
    public void recover(RemoteAccessException e) {
            System.out.println(e.getMessage());
    }
}

参数说明:

@Retryable注解中的参数说明:
maxAttempts:最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
value:抛出指定异常才会重试
include:和value一样,默认为空
exclude:指定不处理的异常,默认空(当与include同时为空时,所有异常都重试)
backoff:重试等待策略,默认使用@Backoff

@Backoff注解中的参数说明:
value:重试间隔时间,默认为1000毫秒
delay:和value一样,但是默认为0
multiplier:(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

4. 在指定方法上标记@Recover来开启重试失败后需要执行的方法(需跟重试方法在同一个类中)

@Recover: 当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。

ps. 避坑提醒

  • 由于retry用到了aspect增强,所有会有aspect的坑,就是方法内部调用时,会使aspect增强失效,那么retry当然也会失效。
public class demo {
    public void A() {
        B();
    }
    //这里B不会执行
    @Retryable(Exception.class)
    public void B() {
        throw new RuntimeException("retry...");
    }
}
  • 重试机制,不能在接口实现类里面写。所以要做重试,必须单独写个service。

参考文献

@Retryable
@Retryable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值