Spring的@Retryable和@Recover注解详解

21 篇文章 0 订阅
订阅专栏
本文详细解读了Spring框架中的@Retryable和@Recover注解,用于处理临时性错误,包括如何配置重试策略、参数一致性、恢复方法的使用以及自定义退避策略。同时强调了合理使用这两个注解对提升应用稳定性和可维护性的平衡考虑。
摘要由CSDN通过智能技术生成

Spring的@Retryable和@Recover注解详解

1. 简介

两个注解一般配合使用,通常用于解决由于网络、数据库、文件系统等原因导致的临时性错误,以提高应用的健壮性和可用性。

  • @Retryable@Recover是Spring Framework中的注解,用于支持在方法执行期间发生异常时的重试和恢复操作。
  • @Retryable注解用于标记方法,在方法执行期间发生异常时进行重试。重试行为可以使用Spring Retry框架提供的默认策略或自定义策略来定义。我们可以指定要重试的异常类型以及最大重试次数和重试间隔等参数。
  • @Recover注解用于标记一个恢复方法,在最终重试失败后执行该方法,降级处理。恢复方法应尽量具有与重试方法相同的参数和返回类型(提一嘴:两个方法的返回值类型必须相同,捕获异常类型和入参可以不同,后面给出实例),并且应在同一类中声明。如果未指定恢复方法,则重试失败后将抛出最后一次异常。

2. 实例:分母=0异常,导致重试(所有实例中fenzi=5,fenmu=0)

想要使用这两个注解,首先需引入依赖spring-retry,再启动类上添加注解@EnableRetry

    /*** 
     * @description: 测试重试和恢复注解,入参写死,fenzi=5, fenmu=0 
     * @param:  
     * @return:  
     * @author name silk
     * @date: 2024/1/30 21:11
     */
    @GetMapping("/retry")
    public String testRetryableAndRecover() {
        return testService.testRetryable(5, 0);
    }

2.1 重试方法,恢复方法有一致的入参类型、返回值类型;重试方法抛出异常与恢复方法异常类型一致;(成功)

    /***
     * @description:  测试注解@Retryable, 重试方法
     * @param: fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Retryable(value = Exception.class, maxAttempts = 3)
    public String testRetryable(int fenzi, int fenmu) {
        int res;
        res = fenzi / fenmu;
        return "the calculate result is : " + res;
    }

    /***
     * @description: 测试恢复方法,降级处理
     * @param: e fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Recover
    public String testRecover(Exception e, int fenzi, int fenmu) {
        log.info("调用恢复方法,做降级处理...");
        return "downgrade process over.";
    }

在这里插入图片描述

在上面的示例中,testRetryable()方法标记为重试,当Exception异常发生时最多重试3次。如果在最终重试失败后,testRetryable()方法将调用testRecover()方法进行恢复操作,并将最后一次重试的异常作为参数传递给testRecover()方法。

2.2 重试方法,恢复方法有一致的返回值类型;入参类型、异常类型不一致;(成功)

/***
     * @description:  测试注解@Retryable, 重试方法
     * @param: fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Retryable(value = Exception.class, maxAttempts = 3)
    public String testRetryable(int fenzi, int fenmu) {
        int res;
        res = fenzi / fenmu;
        return "the calculate result is : " + res;
    }

    /***
     * @description: 测试恢复方法,降级处理
     * @param: e fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Recover
    public String testRecover(ArithmeticException e) {
        log.info("调用恢复方法,做降级处理...");
        return "downgrade process over.";
    }

在这里插入图片描述
根据上述实例看,虽然实例2这种情况能够成功,但是建议开发过程中最好按照第一张情况各参数保持一致。

2.3 扩展:一个类中有多个@Recover和@Retryable怎么区分

如果一个类中有多个方法标记了@Retryable@Recover注解,我们可以通过value属性来区分它们。value属性允许指定一个异常类型的数组,以区分在方法执行期间抛出的不同异常类型。

@Service
public class TestService {
 
    @Retryable(value = {IOException.class})
    public void methodA() throws IOException {
        // Some code that may throw an IOException
    }
 
    @Recover
    public void recoverA(IOException e) {
        // Recovery logic for methodA() goes here
    }
 
    @Retryable(value = {NullPointerException.class})
    public void methodB() throws NullPointerException {
        // Some code that may throw a NullPointerException
    }
 
    @Recover
    public void recoverB(NullPointerException e) {
        // Recovery logic for methodB() goes here
    }
}

在上面的示例中,methodA()methodB()方法都标记为@Retryable注解,以便在抛出IOExceptionNullPointerException异常时进行重试。然后对于每个方法,都定义了一个恢复方法recoverA()recoverB(),分别提供特定于该方法的恢复逻辑。由于每个方法都在@Retryable注解的value属性中指定了不同的异常类型,因此Spring框架可以区分它们,并在适当的时候调用相应的方法。

2.4 扩展:如果上述情况的异常类型也一致怎么区分

如果多个方法在抛出相同的异常时都需要进行重试和恢复操作,我们可以在每个方法上使用相同的@Retryable@Recover注解。在这种情况下,Spring框架会自动根据需要调用相应的恢复方法。

@Recover注解标记的恢复方法中,可以通过方法的参数获取抛出异常的方法和异常信息。具体来说,@Recover方法可以接受与@Retryable注解标记的方法相同的参数,以便在恢复操作中访问异常信息和方法参数。

/***
     * @description:  测试注解@Retryable, 重试方法
     * @param: fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Retryable(value = Exception.class, maxAttempts = 3)
    public String testRetryable(Integer fenzi, Integer fenmu) {
        Integer res;
        res = fenzi / fenmu;
        return "the calculate result is : " + res;
    }

    @Retryable(value = Exception.class, maxAttempts = 3)
    public String testRetryable(String fenzi, String fenmu) {
        Integer res;
        res = Integer.getInteger(fenzi) / Integer.parseInt(fenmu);
        return "the calculate result is : " + res;
    }

    /***
     * @description: 测试恢复方法,降级处理
     * @param: e fenzi fenmu
     * @return:
     * @author name silk
     * @date: 2024/1/30 19:51
     */
    @Recover
    public String testRecover(Exception e, Object fenzi, Object fenmu) {
        if (fenzi instanceof Integer) {
            log.info("重试方法入参类型是Integer,调用恢复方法,做降级处理...");
            return "integer === downgrade process over.";
        } else if (fenzi instanceof String) {
            log.info("重试方法入参类型是String,调用恢复方法,做降级处理...");
            return "string === downgrade process over.";
        }
        log.info("调用恢复方法,做降级处理...");
        return "downgrade process over.";
    }

在这里插入图片描述

在上面的示例中,methodA()methodB()方法都标记为@Retryable注解,以便在抛出Exception异常时进行重试。在@Recover注解标记的恢复方法中,可以通过方法的参数访问抛出异常的方法和方法参数。在上述示例中,我们检查第一个参数的类型以确定是哪个方法抛出了异常,从而提供相应的恢复逻辑。

3. 其他

(1)@Retryablebackoff参数定义了在重试操作之间使用的退避策略,目前支持5种策略:固定间隔退避策略、指数退避策略,随机间隔退避策略、指数退避策略(带有最大退避时间)、自定义退避策略。其中要自定义一个退避策略类,需要实现org.springframework.retry.backoff.BackOffPolicy接口,并实现其backOff()方法,这里不展开介绍了。
(2)最后需要注意,使用@Retryable注解会增加应用的复杂度,因为需要处理异常、定义退避策略等。在使用时需要权衡好可用性、性能和代码的复杂度,并根据具体的场景进行选择。

Java 重试框架 Spring-Retry | @Retryable 注解详解
甘蓝的专栏
04-10 1772
Java 重试框架 Spring Retry 的 @Retryable 注解详解
扒一扒@Retryable注解,很优雅,有点意思
GTH07399的博客
03-15 1411
你好呀,我是动作缓慢的程序猿 可关注公众号 :动作缓慢的程序猿 领取最新大厂面试题 前几天我 Review 代码的时候发现项目里面有一坨逻辑写的非常的不好,一眼望去简直就是丑陋之极。 我都不知道为什么会有这样的代码存在项目里面,于是我看了一眼提交记录准备叫对应的同事问问,为什么会写出这样的代码。 然后... 那一坨代码是我 2019 年的时候提交的。 我细细的思考了一下,当时好像由于对项目不熟悉,然后其他的项目里面又有一个类似的功能,我就直接 CV 大法搞过来了,里面的逻辑也没细看。 ..
Spring 框架——@Retryable 注解与 @Recover 注解
最新发布
代码星辰的博客
09-10 914
本文介绍了 @Retryable 注解与 @Recover 注解的相关知识。
详解spring boot使用@Retryable来进行重处理
08-30
本篇文章主要介绍了详解spring boot使用@Retryable来进行重处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
【python学习】retry库用法大全!附示例代码
m0_54007171的博客
07-27 1035
Retry 是一个用于 Python 的库,用于在函数调用失败时自动重试。它的目标是简化重试逻辑的编写,处理由于临时性问题(如网络故障、API 限制等)导致的失败。
Spring的重试机制:浅谈@Retryable和@Recover注解
m0_73311735的博客
10-12 1822
如上图中的代码所示,我们通过@Retryable注解,对RemoteAccessException异常进行重试,重试次数为2次,第一次重试间隔为5s,之后重试的时间间隔为前一次的2倍,第二次重试间隔10s,第三次重试间隔20s。有两种组合方式,乐观组合重试策略是指只要有一个策略允许重试即可以,悲观组合重试策略是指只要有一个策略不允许重试即不可以。另外@Retryable和@Recover修饰的方法要在同一个类中,且被@Retryable 标记的方法不能有返回值,这样Recover方法才会生效。
SpringBoot常用注解之@Retryable
h254931252的博客
10-24 5323
第一章 @Async注解. 文章目录前言一、@Async是什么?二、使用步骤1.启用@Async2.在方法上添加@Async3.带返回值方法实现异步4.线程池5. 注意事项总结 前言 在平时的项目开发中大家应该遇到过下面类似的场景: 在用户注册通过的同时给用户发短信。 批量推送消息给用户。 凌晨系统自动化统计数据。 大家先想几个问题: 在用户注册的这个接口中,发送短信的逻辑是否应该占用用户注册的时间? 当用户量很大时,如何快速推送? 当统计的数据量很大,统计的指标很多,如何加快定时器统计效率?
跟着ChatGPT学知识之@Retryable和@Recover
qq_39149841的博客
04-16 2538
Retryable和@RecoverSpring Framework中的注解,用于支持在方法执行期间发生异常时的重试和恢复操作。@Retryable注解用于标记方法,在方法执行期间发生异常时进行重试。重试行为可以使用Spring Retry框架提供的默认策略或自定义策略来定义。您可以指定要重试的异常类型以及最大重试次数和重试间隔等参数。@Recover注解用于标记一个恢复方法,在最终重试失败后执行该方法。恢复方法应具有与原始方法相同的参数和返回类型,并且应在同一类中声明。
@Retrybale注解详解
flagsjh的博客
05-17 965
另外,@Retryable默认不会重试Checked Exception,如果要重试Checked Exception,可以使用@Recover注解来处理异常,并返回一个默认值。可以使用include属性来指定需要重试的异常类型,可以使用exclude属性来指定不需要重试的异常类型。可以使用delay属性来指定重试之间的延迟时间,默认为0毫秒。maxDelay属性指定了重试之间的最大延迟时间,默认为0,表示使用无限的延迟。maxDelay属性指定了重试之间的最大延迟时间,默认为0,表示使用无限的延迟。
Spring重试机制 Spring Retry Demo使用实例和@Retryable注解属性说明
程序猿老王的博客
12-18 1410
不知道有没有小伙伴因为调用服务中的种种问题,如:调用异常、结果未返回、网络抖动等等,需要进行重试而困扰过。java的重试机制有很多种,今天咱们一起学习一下Spring-Retry。 什么是Spring Retry Spring Retry为Spring应用程序提供声明式重试支持,我们可以使用@Retryable和@Recover,快捷的实现重试和补偿策略。 Spring Retry G...
Java 重试框架 Spring-Retry | 进阶使用 - listener及自定义注解
甘蓝的专栏
04-11 1479
Java 重试框架 Spring Retry 进阶使用 - 监听器及自定义注解
@Retryable和@Recover的使用
hhsway的博客
07-23 1万+
@Retryable和@Recover实现了重处理,重处理的场景是十分常见的,例如发起网络请求的时候,经常会因为网络波动等原因造成请求失败,产生异常,这时候可以使用@Retryable和@Recover简单的实现重处理。   添加maven依赖。 <dependency> <groupId>org.springframework.retry</gr...
spring-retry的学习使用(指定@Recover方法)
大家都叫我菜鸡刘
06-30 3484
最近研究了一下spring-retry框架地使用。 spring-retry再1.3.0版中@Retryable增加recover属性,从而使得再异常重试失败后可以指定补偿方法执行。 从而使得我们不需要每一个用到@Recover的地方都需要新建一个类。 @Retryable(recover = "compensateHi") @Override public Hello hi(String name) { try { Hello he.
spring-retry @Recover参数传递
LOOPY_Y的博客
04-17 2339
在@Recover中获取到传递给@Retryable方法的参数
Spring基础篇-08-Spring循环重试注解Retryable和Recover的使用
Alan0517
04-20 509
Spring自带的重试
Spring的重试机制-@Retryable注解
Howard_Fang的博客
03-30 924
SpringRetry(spring的自动重试机制),SpringRetry是基于AOP实现的,在应用程序中,由于一些网络等不可预知的问题,我们的程序或者接口调用一个第三方的接口获取数据失败了,这时就需要重试机制,比如延时1S后重试、间隔不断增加重试等。multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
SpringBoot @Retryable注解
热门推荐
wtopps的专栏
12-25 2万+
背景 在调用第三方接口或者使用MQ时,会出现网络抖动,连接超时等网络异常,所以需要重试。为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功。一般情况下,需要我们自行实现重试机制,一般是在业务代码中加入一层循环,如果失败后,再尝试重试,但是这样实现并不优雅。在SpringBoot中,已经实现了相关的能力,通过@Retryable注解可以实现我们想要的结果。 @...
@Retryable注解,优雅的实现循环重试功能
zk86547462的博客
05-05 1万+
在实际工作中,重处理是一个非常常见的场景,比如: 发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。 一、@Retryable是什么? spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方
spring @retryable
05-10
Spring @Retryable注解是一种在Spring框架中实现重试机制的解决方案。这个解决方案的主要思想是在方法发生异常时,让这个方法重新执行一次或多次,直到方法成功执行为止。这个方案可以让开发者在开发过程中减少一定的错误处理代码的编写,同时还可以增加系统的可靠性和鲁棒性。 使用Spring @Retryable注解的方法必须满足一定的条件,首先他必须存在于一个Spring管理的Bean中,其次必须有异常抛出。@Retryable注解可以指定重试的次数,每次重试间隔时间,重试的异常条件等等。这些参数可以根据开发者的需要进行深度定制,以实现更加灵活的重试行为。 @Retryable注解的处理方式是在Spring框架中通过AOP(面向切面编程)来进行的。具体的实现方式是,在AOP中拦截所有的方法调用,当被拦截的方法抛出指定的异常时,AOP会将这个异常交给重试拦截器进行处理,在处理过程中,重试拦截器会根据开发者指定的参数进行重试操作,并在重试次数达到上限后将异常抛回给方法调用者。 总的来说,Spring @Retryable注解提供了一种简单有效的处理异常情况的解决方案。在实际开发过程中,经常会遇到一些类似网络延迟、数据库访问失败等问题,这些问题往往需要程序员进行手动处理,而使用@Retryable注解可以让我们简化这种操作,提高程序的鲁棒性和可靠性。
写文章

热门文章

  • Spring的@Retryable和@Recover注解详解 3114
  • Feign远程调用的基本流程通俗易懂 2510
  • Redisson源码解读—可重入、锁续命详解 2076
  • EasyPoi实现简单的Excel导出、导入 1635
  • HttpServletRequest的getSession()方法逻辑分析 1397

分类专栏

  • 知识点 21篇
  • 笔记-springboot 2篇
  • 笔记-数据库 6篇
  • 笔记-nginx 1篇

最新评论

  • MySQL旧表做分区流程

    秋说: 博主你好,感觉你的文章质量很好,这边有一个合作,可以私信我或添加我文章底部联系方式哈~

  • EasyPoi实现简单的Excel导出、导入

    普通网友: 干货满满!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

  • Feign远程调用的基本流程通俗易懂

    CSDN-Ada助手: 恭喜用户写出了第20篇博客,“Feign远程调用的基本流程通俗易懂”,文章内容让人受益匪浅。希望用户能继续保持创作的热情和努力,不断提升自己的写作水平。接下来,建议可以尝试探索一些具有挑战性的主题,拓展自己的写作领域,相信用户一定会有更多精彩的作品呈现给读者。期待您的下一篇博客!

  • 简版SpringIOC实现(自定义SpringIOC)

    CSDN-Ada助手: 恭喜您发布了第19篇博客!自定义SpringIOC的实现方式十分有趣和富有挑战性,期待您能继续分享更多关于SpringIOC的内容。或许您可以考虑深入探讨SpringIOC的原理及其在实际项目中的应用,这将会给读者带来更多的启发和帮助。希望您能继续保持创作热情,为我们带来更多有价值的内容!祝您创作愉快!

  • HttpServletRequest的getSession()方法逻辑分析

    CSDN-Ada助手: 不知道 网络 技能树是否可以帮到你:https://edu.csdn.net/skill/network?utm_source=AI_act_network

大家在看

  • Robin Helps 703
  • 【Kubernetes】常见面试题汇总(二十九) 908
  • 【毕业设计】一个基于 PHP 和 MySQL 的学生成绩查询系统
  • 技巧/工具 - SSH - Linux/Windows OpenSSH 3步连接 615
  • 关于如何从10个1G的文件中找出出现次数最多的前十个单词 54

最新文章

  • 浏览器向客户端提供文件下载(Java实现)
  • 自定义Springboot Starter
  • MySQL的联合索引及案例分析
2024年18篇
2023年12篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢龙雕塑视频郑州户外玻璃钢雕塑设计乌鲁木齐玻璃钢雕塑厂玻璃钢林则徐雕塑河北直销玻璃钢雕塑按需定制清远玻璃钢动物雕塑销售厂二手玻璃钢卡通动漫雕塑四川常见商场美陈厂家直销来宾玻璃钢雕塑价格济源玻璃钢人物雕塑厂家价格高速玻璃钢小品雕塑图片玻璃钢雕塑象湖南道县玻璃钢伟人雕塑中庭商场美陈售价甘南仿真人物玻璃钢雕塑价格商场美陈装饰是什么材质石家庄市政玻璃钢雕塑推荐货源绵阳逼真玻璃钢座椅雕塑陕西环保玻璃钢雕塑定做价格玻璃钢雕塑家园装修北京商场创意商业美陈价格渭南玻璃钢雕塑柳州玻璃钢雕塑设计商场创意美陈百鸟争鸣展江西户内玻璃钢雕塑定制南昌玻璃钢树脂雕塑报价曲阳红日玻璃钢雕塑玻璃钢雕塑材料配合比朔州玻璃钢雕塑多少钱玻璃钢切面大猩猩雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化