@Retryable(spring的重试机制)

简介

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

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

这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用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 使用详解

猜你喜欢

转载自blog.csdn.net/weixin_43811057/article/details/131759900