@Retryable一个 Spring 注解轻松搞定循环重试功能!

news/2024/12/6 19:51:16/

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

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

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

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

二、使用步骤
1.POM依赖

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

2.启用@Retryable

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

3.在方法上添加@Retryable

@Service
public class TestRetryServiceImpl implements TestRetryService {@Override@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))public int test(int code) throws Exception{System.out.println("test被调用,时间:"+LocalTime.now());if (code==0){throw new Exception("情况不对头!");}System.out.println("test被调用,情况对头了!");return 200;}
}

来简单解释一下注解中几个参数的含义:

  • value:抛出指定异常才会重试
  • include:和value一样,默认为空,当exclude也为空时,默认所有异常
  • exclude:指定不处理的异常
  • maxAttempts:最大重试次数,默认3次
  • backoff:重试等待策略,默认使用@Backoff, @Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
  • 另外,最新 Java 面试题整理好了,大家可以在Java面试库小程序在线刷题。

当重试耗尽时还是失败,会出现什么情况呢?

当重试耗尽时,RetryOperations可以将控制传递给另一个回调,即RecoveryCallback。Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。

4.@Recover

@Recover
public int recover(Exception e, int code){System.out.println("回调方法执行!!!!");//记日志到数据库 或者调用其余的方法return 400;
}

可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。

对于@Recover注解的方法,需要特别注意的是:

  1. 方法的返回值必须与@Retryable方法一致
  2. 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)
  3. 该回调方法与重试方法写在同一个实现类里面

5.注意事项

由于是基于AOP实现,所以不支持类里自调用方法
如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void
方法内不能使用try catch,只能往外抛异常
@Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。
本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的。


http://www.ppmy.cn/news/52450.html

相关文章

WindowsHash简介及windows认证

Windows系统使用两种方法对用户的密码进行哈希处理&#xff0c;他们分别是LAN Manager(LM)哈希和NT LAN Manager(NTML)哈希。 现在已经有了更新的NTLMv2以及Kerberos验证体系。 Windows的系统密码hash默认情况下一般由两个部分组成&#xff1a;第一部分是LM-hash&#xff0c;…

QML中【预计符号】和【Unknown Component M300】的红色警告解决方法

问题描述&#xff1a; QML的项目中带中文&#xff0c;每次打开项目都在问题栏显示【预计符号】的红色警告&#xff0c;还有一种是【Unknown Component M300】的警告&#xff0c;代码能正常编译和运行。像我这样对代码追求优雅的强迫症患者看着很不爽&#xff0c;查了很多网上的…

Python3 爬虫爬取浏览器数据注意事项

笔者使用爬虫从某一平台获取某些设备的数据并导入另一平台&#xff0c;从不会到完成用了一周时间&#xff0c;总结 经验如下&#xff1a; 1.默认使用chrome 浏览器&#xff0c;配合 webdirver 驱动 2.注意chrome 版本和webdriver驱动版本匹配 3.配合书本 python3 网络爬虫开发…

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日&#xff0c;据DAMA中国官方信息&#xff0c;目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算6月考试的朋友们可以抓紧时间报名啦…

js版计算连续12个月计算不超3万公里

<!--考虑比亚迪车友不是程序员的多&#xff0c;写了个html版的&#xff0c;复制以下代码在记事本&#xff0c;改后缀名为test.html&#xff0c;然后用浏览器打开--> <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>…

深入理解AMQP协议

一.AMQP 是什么 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c; 高级消息队列协议&#xff09;是一个提供统一消息服务的 应用层标准高级 消息队列协议&#xff0c;是 应用层协议的一个 开放标准,为面向消息的中间件设计&#xff0c;是一个进程间传递 异步消息…

【Linux命令篇】正则表达式浅析

前言 转义字符是将普通字符转化为特殊字符的一种方式。 在正则表达式中&#xff0c;一些字符被定义为特殊字符&#xff08;也称为元字符&#xff09;&#xff0c;它们具有特殊的含义。这些特殊字符包括&#xff1a; 句点字符 .&#xff1a;可以匹配除了换行符以外的任何单个…

Linux NAT软路由的简介、入门与配置

本文目录 1、确认Linux kernel内核版本2、netfilter的nat table简介3、用iptables实现SNAT3.1、 多对多(N:N)的SNAT3.2、 将一个网段内的某个公网IP移除出SNAT可用的公有IP地址池3.3、 设置目标地址为特定IP地址或者网段的报文不做NAT3.4、通过端口号&#xff0c;设置允许或者禁…