spring-retry详解

spring-retry详解

    • 1.引入依赖
    • 2.Retryable基础使用
    • 3.Recover使用
    • 4.Retryable参数详解
    • 5.需要注意

重试机制对于大部分场景来说都是必要的,比如同步调用三方接口,三方接口、信息拉取等网络原因突然不通,有了重试就可以多一些容错机制,异常场景下让系统多一点健壮。

1.引入依赖

需要两个依赖,注意都需要添加,不加aop依赖也不行。注意版本可以不声明使用父工程springboot的版本亦可。

        <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2.Retryable基础使用

启动类增加注解

@EnableRetry

下面是controller入口代码,没啥用就是一个入口

@javax.annotation.Resource
TestService testAction;@PostMapping("/test")
public void testRetry(){String s = testAction.testAction(1);System.out.println("接收返回:"+s);
}

下面是真正的service代码

@Retryable(value = {RuntimeException.class}, maxAttempts = 2, backoff = @Backoff(delay = 1000) )
public String testAction(Integer a){try {System.out.println("异常前输出,接收入参:"+a);int i = a/0;System.out.println("异常后输出,接收入参:"+a);} catch (Exception e) {throw new RuntimeException(e);}return "正常返回";
}

调用接口执行结果如下:
在这里插入图片描述

可以看到确实在异常场景进行了重试,上面加不加try-catch没有任何影响,加了目的是为了保证抛出的异常是统一的
这也就达到了目的了,基础使用就是这样,下面一起看看参数该如何设置。

3.Recover使用

上面的重试次数用完以后还是异常会抛出异常,此时异常我们可以选择在调用方(Retryable方法的调用法)继续处理,也可以选择单独加个方法只用来处理异常,这样调用方(Retryable方法的调用法)就可以只专注处理正常逻辑即可。那如何使用呢,注意以下几点:

  • Recover注解修饰的方法的入参第一个应该是Retryable方法中抛出的异常
  • Recover注解修饰的方法的入参可以将Retryable的入参全部加进来,方便后续处理,但Retryable内部的数据无法传递到Recover,可以通过抽离方法达到公用的目的
  • Recover和Retryable修饰的方法必须在同一个类中
  • Recover和Retryable修饰的方法返回类型必须一样
  • Retryable中无需声明recover的属性,测试后声明了反而不生效

下面是上面Retryable的对应方法

@Recover
public String recover2(RuntimeException e, int code){System.out.println("回调方法2,入参:"+code);log.error("异常信息:",e);return "异常返回";
}

测试结果如下:
在这里插入图片描述
可以看到,异常后正常进入到了这个方法,其实就是相当于把这个方法代理下将其放入到Retryable中的方法一起执行,所以需要保持两个方法的的高度一致(主要是出入参,同一个类中)。

4.Retryable参数详解

  • recover: 不建议使用,加了以后测试反而找不到异常的回调方法了,不加好使,也有可能是我配置不到位
  • value:声明哪些异常触发重试
  • include:同上
  • exclude:声明异常哪些不触发重试
  • label:标记当前的重试,便于追查
  • maxAttempts:最大重试次数,默认3
  • backoff:重试策略,用来定义重试的间隔与频率
    • delay:重试间隔,默认1000ms
    • value:同上
    • multiplier:间隔乘子,比如delay是1s,该值是2,那么第一次间隔就是两2s,第二次是就是4s
    • maxDelay:最大间隔,间隔时间最大的值,用于制约乘子与delay。

5.需要注意

  • 注意Retryable不可以使用在controller层
  • 同类多个Retryable和Recover,可以用入参、出参来进行自动区分,同时也可以使用不同的异常来区分,比如抛出不同的异常也是可以区分的,因为Recover的入参的异常是确定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox--Knife

Knife 测试过程 1 信息收集 端口扫描 80端口测试 echo "10.129.63.56 knife.htb" | sudo tee -a /etc/hosts网站是纯静态的&#xff0c;无任何交互功能&#xff0c;检查网页源代码也未发现任何可利用的文件。 检查页面请求时&#xff0c;请求与响应内容&#xff0…

笔记小结:卷积神经网络之多输入多输出通道

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 彩色图像具有标准的RGB通道来代表红、绿和蓝&#xff0c;需要三个通道表示&#xff0c;故而只有单输入单输出是不够的。 对于单个输入和单个输出通道的简化例子&…

vscode配置latex环境制作【文档、简历、resume】

vscode配置latex环境制作【文档、简历、resume】 1. 安装Tex Live及vscode插件 可以参考&#xff1a;vscode配置latex环境制作beamer ppt 2. 添加vscode配置文件 打开vscode&#xff0c;按下Ctrl Shift P打开搜索框&#xff0c;搜索Preference: Open User Settings (JSON…

深入理解Linux网络(四):TCP接收阻塞

TCP socket 接收函数 recv 发出 recvfrom 系统调用。 进⼊系统调⽤后&#xff0c;⽤户进程就进⼊到了内核态&#xff0c;通过执⾏⼀系列的内核协议层函数&#xff0c;然后到 socket 对象的接收队列中查看是否有数据&#xff0c;没有的话就把⾃⼰添加到 socket 对应的等待队列⾥…

Conda和Pip有什么区别?

conda和pip是Python中两种常用的包管理工具&#xff0c;它们在用途、包来源以及环境管理等方面存在区别。以下是具体分析&#xff1a; 用途 conda&#xff1a;conda是Anaconda发行版中的包管理工具&#xff0c;可以管理包括非Python软件包在内的各种包。它是一个全面的环境管理…

为什么企业一定要多参加展会,参展有何好处?

在当今的商业环境中&#xff0c;展会已成为企业不可或缺的市场推广和交流平台。无论企业规模大小&#xff0c;参展都是一个极其有益的选择。以下&#xff0c;我们将深入探讨企业为何要多参加展会&#xff0c;以及参展所能带来的种种好处。 一、增强品牌影响力与知名度 展会是聚…

大数据量接口响应慢-传输优化

问题 接口一次性返回大量数据&#xff0c;导致JSON数据大小过大&#xff0c;带宽大小不足&#xff0c;导致接口响应时间过长 解决方案 通过数据传输压缩来降低传输数据的大小&#xff0c;从而提高传输效率 服务器端压缩 springboot项目配置application文件&#xff0c;通过…

视频翻译保留原音色pyvideotrans+clone-voice

剪映的视频翻译时长限制5分钟以内&#xff0c;需要积分2700首次有减免大概21.6元&#xff08;1秒9积分/1元100积分&#xff09; • 视频翻译配音工具pyvideotrans 将视频从一种语言翻译为另一种语言&#xff0c;并添加配音 打包链接&#xff1a;夸克网盘分享 升级补丁&#…

MySQL通过bin-log恢复数据

MySQL通过bin-log恢复数据 1.bin-log说明2.数据恢复流程2.1 查看是否开启bin-log2.3 查看bin-log2.4 执行数据恢复操作2.5 检查数据是否恢复 1.bin-log说明 mysqldump和bin-log都可以作为MySQL数据库备份的方式&#xff1a; mysqldump 用于将整个或部分数据库导出为可执行的S…

cms wpscan使用方式--kali linux

WPScan是一个用于WordPress安全审计和漏洞扫描的工具&#xff0c;可以通过以下命令来使用WPScan&#xff1a; 扫描一个网站&#xff1a; wpscan --url http://example.com扫描一个网站并指定用户名和密码&#xff1a; wpscan --url http://example.com --useradmin --passwo…

RoundCube搭建安装教程:服务器配置方法?

RoundCube搭建安装教程的疑问解析&#xff01;怎么搭建邮件系统&#xff1f; RoundCube是一款开源的Web邮件客户端&#xff0c;具有现代化的用户界面和丰富的功能&#xff0c;可以通过浏览器访问邮件服务器。AokSend将详细介绍如何在服务器上配置和安装RoundCube&#xff0c;以…

【Linux】SYSCALL_DEFINE4 openat执行流程摸索

在上一篇博客&#xff0c;我们基于pr_info这个内核类似c语言printf打印宏完成了打印&#xff0c;基本实现了自由开关打印&#xff0c;可以设定打印日志次数&#xff08;代码写了&#xff0c;大概10行代码&#xff09;&#xff0c;在测试的时候发现居然还有意外收获&#xff0c;…

物联网平台是干什么的用的

物联网平台是一个基于互联网技术和传感器技术&#xff0c;用于实现物联网应用开发、管理和运营的软件平台。以下是物联网平台的主要用途和功能&#xff0c;以及在一些领域的应用举例&#xff1a; 一、物联网平台的主要用途和功能 设备管理&#xff1a;物联网平台能够管理大量的…

嵌入式硬件-Xilinx FPGA DDR4 接口配置基础(PG150)

1. 简介 1.1 DDR4 SDRAM 控制器主要特点 支持8到80位接口宽度的组件&#xff08;支持 RDIMM、LRDIMM、UDIMM 和 SODIMM&#xff09; 最大组件限制为9&#xff0c;此限制仅适用于组件&#xff0c;不适用于 DIMM。密度支持 最高支持 32 GB 的组件密度&#xff0c;64 GB 的 LRDI…

Transformer图文详解【Attention is all you need】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 文章目录 NLP-大语言模型学习系列目录一、Transformer框架二、Encoder&#xff08;1&#x…

第十四届蓝桥杯省赛C++B组I题【景区导游】题解(AC)

解题思路 题目已给出地图为一个 n n n 个点&#xff0c; n − 1 n-1 n−1 条路线的树。 对于计算树中任意两点的距离&#xff0c;我们可以使用 LCA 算法进行快速计算。 假设 a , b a, b a,b 的最近公共祖先为 c c c&#xff0c;那么 a , b a,b a,b 之间的距离为 d i s …

太速科技-基于XCVU9P+ C6678的8T8R的无线MIMO平台

基于XCVU9P C6678的8T8R的无线MIMO平台 一、板卡概述 板卡基于TI TMS320C6678 DSP和XCVU9P高性能FPGA&#xff0c;FPGA接入4片AD9361 无线射频&#xff0c;构建8输入8输出的无线MIMO平台&#xff0c;丰富的FPGA资源和8核DSP为算法验证和信号处理提供强大能力。 二…

python:本机摄像头目标检测实时推理(使用YOLOv8n模型)

本文将介绍如何使用本机摄像头进行目标检测实时推理的python代码。 文章目录 一、下载YOLO权重文件二、环境配置三、完整代码 一、下载YOLO权重文件 https://github.com/ultralytics/ultralytics?tabreadme-ov-file 拉到网页最下面&#xff0c;选择适合的模型&#xff0c;下…

【引领未来智造新纪元:量化机器人的革命性应用】

在日新月异的科技浪潮中&#xff0c;量化机器人正以其超凡的智慧与精准的操作&#xff0c;悄然改变着各行各业的生产面貌&#xff0c;成为推动产业升级、提升竞争力的关键力量。今天&#xff0c;让我们一同探索量化机器人在不同领域的广泛应用价值&#xff0c;见证它如何以科技…