spring-retry详解

news2024/12/23 13:34:13

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.coloradmin.cn/o/1940768.html

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

相关文章

压缩包方式windows安装mysql

压缩包方式windows安装mysql 本文介绍通过压缩包方式在Windows本地安装mysql。 一、 具体步驟 步骤1&#xff0c;下载mysql压缩程序 这里好像上传不了压缩文件&#xff0c;先这样吧&#xff0c;后期补充。 步骤2&#xff0c;解压并手写添加 my.ini 文件 my.ini 文件内容如下…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

ontap simulator配置过程

一、下载模拟器 参考《Simulate_ONTAP_9-14-1_Installation_and_Setup_Guide.pdf》P4的指导&#xff0c;登录网站进行下载。 二、传入pve&#xff0c;并解压转换 # 解压 tar -xvf vsim-netapp-DOT9.14.1-cm_nodar.ova# 解压后的文件列表&#xff0c;其中ovf文件里定义了虚拟机…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from library/elasticsearch eaead16dc43b: Retrying in 1 second a405acf5b7d4: Retrying in 1…

结构体[C语言]

文章目录 结构体的概念结构体的用法定义结构体创建结构体变量访问结构体成员 结构体的应用 结构体的概念 结构体是一种用户自定义的数据类型&#xff0c;它允许我们将逻辑上相关的不同数据类型组合在一起。例如&#xff0c;如果我们想要表示一个学生的信息&#xff0c;我们可以…

texify - 识别数学/图像 PDF

文章目录 一、关于 texify例子训练 二、安装手动安装 三、使用1、使用技巧2、用于交互转换的应用程序3、转换图像4、Python 中导入并运行 四、限制五、基准测试运行自己的基准测试 六、其它商业用途感谢 一、关于 texify Texify是一种OCR模型&#xff0c;它将包含数学的图像或…

数据结构(Java):优先级队列(堆)堆的模拟实现PriorityQueue集合

目录 1、优先级队列 1.1 概念 1.2 PriorityQueue底层结构 2、 堆 2.1 堆的概念 2.2 堆的存储结构 3、优先级队列&#xff08;堆&#xff09;的模拟实现 3.1 堆的创建 3.1.1 向下调整算法建完整堆 3.2 堆的插入 3.2.1 向上调整算法 3.3 堆的删除 3.4 堆排序 4、Pri…

Java实现随机题库-全站最呆瓜思想,保证你能学会

目录 Blue留言 &#xff1a; 学本篇文章之前所需掌握技能 推荐视频&#xff1a; 代码逻辑思想 步骤&#xff1a; 1、引入依赖 2、做一个excel表格 3、java实现从excel表中取数据 第一步&#xff1a;根据excel上面的字段名&#xff08;如下图&#xff09;&#xff0…

Python应用开发——30天学习Streamlit Python包进行APP的构建(18):定制组件

Custom components定制组件 st.components.v1.declare_component 创建自定义组件,并在有 ScriptRunContext 的情况下进行注册。 如果没有 ScriptRunContext,则不会注册该组件。当自定义组件作为独立命令执行时(如用于测试),可能会出现这种情况。 要使用该函数,请从 s…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…

分布式系列之ID生成器

背景 在分布式系统中&#xff0c;当数据库数据量达到一定量级后&#xff0c;需要进行数据拆分、分库分表操作&#xff0c;传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求&#xff0c;它只能保证在单个表中唯一&#xff0c;所以需要一个在分布式环境下都…

JavaScript进阶之作用域解构箭头函数

目录 一、作用域1.1 局部作用域1.2 全局作用域1.3 作用域链1.4 垃圾回收机制1.5 闭包1.6 变量提升 二、函数进阶2.1 函数提升2.2 函数参数2.3 箭头函数&#xff08;重要&#xff09; 三、解构赋值3.1 数组解构3.2 对象解构&#xff08;重要重要&#xff09; 一、作用域 1.1 局…

全自动蛋托清洗机介绍:

全自动蛋托清洗机&#xff0c;作为现代蛋品处理设备的杰出代表&#xff0c;凭借其高效、智能、环保的特性&#xff0c;正逐步成为蛋品加工行业的得力助手。 这款清洗机采用了先进的自动化设计理念&#xff0c;从进料、清洗到出料&#xff0c;全程无需人工干预&#xff0c;极大…

SpringCloud---服务注册(Eureka)

目录 前言 一.注册中心 二.CAP理论 三.常见的注册中心 四.Eureka 4.1搭建Eueka Server 4.2服务注册 4.3发现服务 4.4小结 学习专栏&#xff1a;http://t.csdnimg.cn/tntwg 前言 在SpringCloud里&#xff0c;我们可以发现一个巨大的问题&#xff0c;就是url是写死的&am…

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑&#xff0c;es找不到时间戳。最近我这边的es重新装了一遍&#xff0c;结果发现grafana连不上elasticsearch了&#xff08;以下简称es&#xff09;&#xff0c;排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容&#xff0c;最后才发现是数值类型问题 一…

一天搞定React(3)——Hoots组件

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

【Node】npm i --legacy-peer-deps,解决依赖冲突问题

文章目录 &#x1f356; 前言&#x1f3b6; 一、问题描述✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 npm i --legacy-peer-deps&#xff0c;解决依赖冲突问题 &#x1f3b6; 一、问题描述 node执行安装指令时出现报错&#xff…

【QT】label适应图片(QImage)大小;图片适应label大小

目录 0.简介 1.详细代码 1&#xff09;label适应img大小 2&#xff09;img适应label大小 0.简介 一个小demo &#xff0c;想在QLabel中放一张QImage的图片&#xff0c;我有一张图片叫【bird.jpg】&#xff0c;是提前放在资源文件中的&#xff0c;直接显示在label上后&#…