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

news/2024/4/14 12:06: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;设置允许或者禁…

中厂,面试就问了4道题,凉了!

你好&#xff0c;我是田哥 所谓的金三银四&#xff0c;已变成铜三铁四了。很多人基本上莫有面试机会&#xff0c;更可惜的是机会有了&#xff0c;却没有把握住。 加入我知识星球&#xff1a;免费做简历优化、简历包装、模拟面试... 今天早上&#xff0c;一个朋友和我说面试中被…

【redis】学了redis不会实战?看这篇就够了

文章目录 前言一、String 命令实战1.业务缓存2.分布式锁3.限流 二、List 命令实战1.提醒功能2.热点列表 三、Hash 命令实战1.用户资料缓存2.购物车实战 四、Set命令实战1.标签系统2.自适应黑白名单系统 五、Sorted Set命令实战1.积分排名2.延时消息 总结 前言 适用人群&#x…

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目&#xff1a; RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址&#xff1a; https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊&#xff1a; IEEE Access ( Volum…

创造者基金 2023 年 4 月亮点

隆重推出创作者基金的 2023 年 4 月亮点 NFT 系列——一系列令人着迷且令人惊叹的数字资产&#xff0c;让大家为之震撼&#xff01;该系列的角色令人惊叹&#xff0c;包括阿兹特克酋长、维京战士、残酷的国王、传奇的九尾狐等等&#xff0c;是收藏家和爱好者的必备之物。 无论你…

python3环境搭建

Unix & Linux 平台安装 Python3: 以下为在 Unix & Linux 平台上安装 Python 的简单步骤&#xff1a; 打开 WEB 浏览器访问 https://www.python.org/downloads/source/选择适用于 Unix/Linux 的源码压缩包。下载及解压压缩包 Python-3.x.x.tgz&#xff0c;3.x.x 为你下…

APS中零件工序间的移动方式解析

在加工装配的成批生产类型企业里&#xff0c;由于零件多种多样&#xff0c;工艺路线、加工方法和技术装备千差万别&#xff0c;因而&#xff0c;产品有多种流转方式。一般来说&#xff0c;零件在各道工序间的移动方式主要有顺序移动、平行移动和平行顺序&#xff08;平顺&#…

软件测试之基础概念学习篇(需求 + 测试用例 + 开发模型 + 测试模型 + BUG)

文章目录 1. 什么是软件测试2. 软件测试和软件开发的区别3. 软件测试和软件调试的区别4. 什么是需求1&#xff09;以需求为依据设计测试用例 5. 测试用例是什么6. 什么是 BUG&#xff08;软件错误&#xff09;7. 五个开发模型1&#xff09;瀑布模型2&#xff09;螺旋模型3&…

〖ChatGPT实践指南 - 零基础扫盲篇⑦〗- 基于 Python 实现的 OpenAI-Library 的简单使用

文章目录 ⭐ python 安装 OpenAI library⭐ 创建 openai.py 进行测试⭐ openai.Completion.create() 方法的小拓展 该章节我们呢来学习一下 OpenAI-Library 的使用&#xff0c;OpenAI-Library 是 OpenAI 官方给我们提供的各种开发语言的库&#xff0c;供我们使用。在前面的章节…

OrbStack

OrbStack 是一个可以在 macOS 上快速运行 Docker 容器&#xff0c;和 Linux 虚拟机的工具&#xff0c;资源占用率低&#xff0c;高效&#xff0c;快速。 macOS 上的 Parallels Desktop 和 Docker Desktop 一直是饱受诟病&#xff0c;慢、重、资源消耗巨大。OrbStack 的出现就是…

matlab实现在画图的图窗里播放点数据的循环

数据准备 我准备好了打包的数据文件供演示下载&#xff0c;只需要小白式的操作。传送门 文件里集成了处理好的点云文件&#xff0c;如果你想显示曲线&#xff0c;只需要把你的数据批量更换上去即可。   每一个里面包含了以下信息&#xff1a; location&#xff1a;不同点的…

Excel数据分列的详细用法

Excel数据分列的详细用法 数据分列常见功能有日期格式的转换&#xff0c;有规律的数据分列&#xff0c;固定宽度的数据分列&#xff0c;读书屋办公教程网这篇文章将详细讲解Excel快速填充及文本与数值的互换。 软件演示版本&#xff1a;Microsoft Excel2019 快速填充 如下图表…

牛客网Python入门103题练习|(06--条件语句(1))

⭐NP43 判断布尔值 描述 Python的条件语句依靠将运算结果转变成布尔值后进行判断&#xff0c;然后分支&#xff0c;如果我们直接判断布尔值会怎么样呢&#xff1f;输入布尔变量&#xff0c;使用条件语句判断&#xff0c;如果为真则输出"Hello World!"&#xff0c;否…
最新文章