SpringRetry重试机制(3秒上手)

2023-11-04

前言

SpringRetry重试机制在实际工作中的场景,比如:

  • 发送消息失败,需要重新发送。
  • 调用远程服务失败,需要重新发送。

这些错误可能是因为网络波动造成的,等待过后重处理就能成功。spring-retry可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。

一、SpringRetry的使用

1.1 引入依赖

基于AOP实现,因此还需引入aop相关的依赖

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

1.2 开启重新机制

springboot入口类添加注解 @EnableRetry
在这里插入图片描述

1.3 3 在方法上添加@Retryable

@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 1))

参数的含义:

  • value:抛出指定异常才会重试
  • include:和value一样,默认为空,当exclude也为空时,默认所有异常
  • exclude:指定不处理的异常
  • maxAttempts:最大重试次数,默认3次
  • backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000(单位毫秒),我们设置为2000;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

  /**
     * value:抛出指定异常才会重试
     * include:和value一样,默认为空,当exclude也为空时,默认所有异常
     * exclude:指定不处理的异常
     * maxAttempts:最大重试次数,默认3次
     * backoff:重试等待策略,
     * 默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000; 以毫秒为单位的延迟(默认 1000)
     * multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
    
     */

@Override
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 1))
    public String test(int n) {
        log.info("测试一下:{}",n);
        //模拟业务出错
        if(1==1 )throw  new RuntimeException("自定义异常");
        return "200";
    }

1.3.4 编写重试失败后的执行的方法

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

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

   /**
     * Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。
     * 如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。
     * 可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。
     * 注意事项:
     * 方法的返回值必须与@Retryable方法一致
     * 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)
     * 该回调方法与重试方法写在同一个实现类里面
     *
     * 由于是基于AOP实现,所以不支持类里自调用方法
     * 如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void
     * 方法内不能使用try catch,只能往外抛异常
     * @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

     */
    @Recover
    public String recover(Exception e, int n)  {
        System.out.println("重试后也未成功,才会执行的方法,发邮箱通知后台人员,记日志");
        return "400";
    }

测试

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringRetry重试机制(3秒上手) 的相关文章

  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 阿里云OSS 图片处理api(custom)

    首先放个阿里云OSS图片处理接口文档 阿里云官方地址 OSS 图片处理接口文档 我们有时会抱怨用户上传的图文中图片文件大了 假如说3M的图片 导致生成的网页打开速度慢 怎么办呢 问题分析 网页打开慢是因为网页资源下载的那张图片下载慢 只要能
  • LoadRunner中的WebTours单独配置,及页面空白展示解决方案

    1 从loadrunner12安装包中提取文件 提取strawberry perl文件整个文件夹 webtours文件整个文件 或者去官网下载 我觉得下载太慢就到安装包中直接提取 2 拷贝strawberry perl webtours到一
  • golang中关于channel中的for range遍历操作

    note channel中若要使用for range进行遍历操作 channel必须首先要进行关闭操作的 例一 func main wg Add 2 write make chan int 5 read make chan int 5 go
  • canvas 动态背景粒子特效 直接拿走

  • 五子棋c++代码_C++大作业赏析

    清小C C 大作业赏析 如何完成一篇优秀的C 大作业 苦恼C 大作业的同学快点进来看看 小声 五子棋设计 五子棋是大家最为熟悉双人对弈的棋类游戏之一 只要任意行 列 斜线连成五子即可获胜 上个学期中 陈昊柯同学的大作业实现了五子棋 不但能够
  • 循环进度可视化tqdm

    Python的tqdm库是循环进度条可视化 可以在 Python 循环中添加一个进度提示信息 用户只需要封装任意的迭代器 tqdm iterator 这里我们分3个部分展示 介绍 使用 实例 安装用pip即可 1 介绍 首先先来看一下如何创
  • express中间件详解

    Express中间件是一个函数 它可以访问请求对象 req 响应对象 res 和next函数 中间件的主要作用是在处理请求之前或之后执行一些操作 例如验证用户身份 记录日志 解析请求体等 使用Express中间件有两种方式 应用级别和路由级
  • STM32CUBEMX_日志系统_RTT和串口(重映射浮点数打印)

    STM32CUBEMX 日志系统 RTT和串口 重映射浮点数打印 前言 嵌入式系统开发过程中日志的打印至关重要 他在系统架构搭建和开发过程中包括后期调试定位问题都非常重要 所以在此记录两种日志打印的方式 第一种是移植J link中自带的RT
  • 生成数字与字母组合随机的字符串

    package kmt test cn import java util Random public class StringRandom 生成随机数字和字母 public String getStringRandom int length
  • Springboot中Eureka的使用方法

    在微服务架构中 注册中心是核心的基础服务 它主要记录各个微服务和微服务地址的映射关系 各个微服务都将自己注册到这个注册中心上面 当微服务之间需要互相调用时 就可以从注册中心上面去发现微服务和进行调用 Spring Cloud是一个开箱即用的
  • Linux基础及Linux环境搭建(保姆级别)

    详细 第一章 Linux基础及Linux环境搭建 保姆级别 Kali BugChen的博客 CSDN博客 第一章 Linux基础及Linux环境的搭建 保姆级别 一 Linux简介 1 什么是Linux 一款免费开源流行的操作系统 2 Li
  • 被车撞了!

    买了新车之后 因为是新手司机上路 开了不到4个月 车身已经被划伤好多处了 有的是我自己不小心划的 有的是车在停车场 不知道被谁划伤的 找不到肇事者了 不过好在都是小小的划伤 不影响车的颜值 也不影响驾驶体验 一开始我还很心疼 后来也释然了
  • 【Linux】进程间通信1-匿名管道1

    文章目录 管道符 创建匿名管道的pipe函数 从内核角度深入理解管道 代码验证pipe函数 管道和子进程的先后创建顺序 代码实现父子进程的通信 管道的特性 前言 为什么需要进程间通信呢 每一个进程的数据都是存储在物理内存当中的 进程通过各自
  • 【JMeter】beanshell 获取/修改请求头信息

    在使用jmeter做接口测试的时候 相信大家一定遇到过以下场景 使用HTTP信息头管理器设置全局请求头信息 如 content type application json 但并非所有的接口的content type都是application
  • osal_start_timerEx 函数分析

    经常用到osal start timerEx函数来周期性产生某一事件 本文就来分析一下该函数 fn osal start timerEx brief This function is called to start a timer to e
  • 同一台电脑安装多个版本的idea

    同一台电脑安装多个版本的idea 需求 当前 电脑上已经安装了idea2019 3 exe版本 发现此版本太旧了 无法体验新版idea2023 1的很多功能及优化 新出的好多idea插件都不支持idea2019 3版本了 比如 支持Chat
  • C/C++浮点数的存储方式 IEEE-754标准,以及实现一个ftoa函数将浮点数转换为字符串

    浮点数的存储格式 转载自 http www cnblogs com dolphin0520 archive 2011 10 02 2198280 html C C 浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的 例如一个
  • 遍历Map的四种方法

    遍历map的4种方式的比较 public static void main String args Map
  • 机器学习(第一章)—— 特征工程

    目录 一 特征归一化 二 类别型特征 三 高维组合特征的处理 四 组合特征 五 文本表示模型 六 Word2Vec 七 图像数据不足时的处理方法 为什么需要对数值类型的特征做归一化 怎样处理类别型特征 什么是组合特征 如何处理高维组合特征
  • SpringRetry重试机制(3秒上手)

    目录 前言 一 SpringRetry的使用 1 1 引入依赖 1 2 开启重新机制 1 3 3 在方法上添加 Retryable 1 3 4 编写重试失败后的执行的方法 测试 前言 SpringRetry重试机制在实际工作中的场景 比如