@Retryable(spring的重试机制)

文章介绍了Spring的重试机制,特别是@Retryable注解的使用。通过在pom添加依赖,启用@EnableRetry并在需要重试的方法上添加@Retryable,可以优雅地处理重试逻辑。@Retryable注解包含如maxAttempts、backoff等参数,用于配置重试次数和间隔。同时,可以使用@Recover注解定义重试失败后的回调方法。

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

简介

在实际工作中,重处理是一个非常常见的场景,比如:

  • 发送消息失败。
  • 调用远程服务失败。
  • 争抢锁失败。

这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。

@Retryable是什么?

spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

@Retryable是Spring提供的可重试注解,为了使用spring提供的重试机制,需要做如下操作:

1、在pom文件中添加相应的依赖

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

2、在启动类或者方法所在的类上添加注解@EnableRetry

3、在需要重试的方法上添加注解@Retryable,示例如下:

@Retryable(maxAttempts = 3, backoff = @Backoff(value = 3000, multiplier = 1.5))
public Customer getCustomer(String customerId) {
		if (true) {
			JSONArray data = retObj.getJSONArray("data");
			if (data != null && !data.isEmpty()) {
				return data.toJavaList(Customer.class).get(0);
			}
		} else {
			log.error("异常,{}", customerId);
			throw new RuntimeException("获数据失败");
		}
		return null;
}

@Retryable注解中的参数说明:

  • maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
  • value:抛出指定异常才会重试
  • include:和value一样,默认为空,当exclude也为空时,默认所以异常
  • exclude:指定不处理的异常
  • backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,我们设置为2000L。

@Backoff注解中的参数说明:

  • value:隔多少毫秒后重试,默认为1000L,我们设置为3000L;
  • delay:和value一样,但是默认为0;
  • multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

4、可以在指定方法上标记@Recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)

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

上一篇:Async 使用详解

Spring @Retryable注解是一种在Spring框架中实现重试机制的解决方案。这个解决方案的主要思想是在方法发生异常时,让这个方法重新执行一次或多次,直到方法成功执行为止。这个方案可以让开发者在开发过程中减少一定的错误处理代码的编写,同时还可以增加系统的可靠性和鲁棒性。 使用Spring @Retryable注解的方法必须满足一定的条件,首先他必须存在于一个Spring管理的Bean中,其次必须有异常抛出。@Retryable注解可以指定重试的次数,每次重试间隔时间,重试的异常条件等等。这些参数可以根据开发者的需要进行深度定制,以实现更加灵活的重试行为。 @Retryable注解的处理方式是在Spring框架中通过AOP(面向切面编程)来进行的。具体的实现方式是,在AOP中拦截所有的方法调用,当被拦截的方法抛出指定的异常时,AOP会将这个异常交给重试拦截器进行处理,在处理过程中,重试拦截器会根据开发者指定的参数进行重试操作,并在重试次数达到上限后将异常抛回给方法调用者。 总的来说,Spring @Retryable注解提供了一种简单有效的处理异常情况的解决方案。在实际开发过程中,经常会遇到一些类似网络延迟、数据库访问失败等问题,这些问题往往需要程序员进行手动处理,而使用@Retryable注解可以让我们简化这种操作,提高程序的鲁棒性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值