服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

SpringBoot 中使用 spring-retry 轻松解决重试

日期: 来源:Java知音收集编辑:

在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为了更加健壮并且更不容易出现故障,需要重新触发业务操作,以防止间歇性的异常对程序照成的影响。

常用的重试策略,比如通过 while 循环手动重复调用或是通过 JDK/CGLib 动态代理的方式来进行重试。但是这种方法比较笨重,且对原有逻辑代码的入侵性比较大。

1、引入spring-retry

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

这里我们还引入了 aop 的依赖,因为 spring-retry 的原理就是基于 aop 来实现的

2、开启spring-retry

启动类上增加注解 @EnableRetry

@EnableRetry
@SpringBootApplication
public class AsurplusApplication {
    public static void main(String[] args) {
        SpringApplication.run(AsurplusApplication.class, args);
    }
}

3、@Retryable

在需要重试的方法上增加注解 @Retryable,表示该方法需要重试

@Component
public class TestRetry {

    int a = 0;

    @Retryable(value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未满足条件");
        }
        return "执行成功";
    }

}

@Retryable 注解

  • value,可重试的异常类型。含义同include。默认为空(如果excludes也为空,则重试所有异常)
  • include:可重试的异常类型。默认为空(如果excludes也为空,则重试所有异常)
  • exclude:无需重试的异常类型。默认为空(如果includes也为空,则重试所有异常)
  • maxAttempts:最大重试次数(包括第一次失败),默认为3次
  • backoff:重试等待策略,下面会在@Backoff中介绍
  • recover:表示重试次数到达最大重试次数后的回调方法

@Backoff 注解

  • delay,重试之间的等待时间(以毫秒为单位)
  • maxDelay,重试之间的最大等待时间(以毫秒为单位)
  • multiplier,指定延迟的倍数
  • delayExpression,重试之间的等待时间表达式
  • maxDelayExpression,重试之间的最大等待时间表达式
  • multiplierExpression,指定延迟的倍数表达式
  • random,随机指定延迟时间

4、重试耗尽

当重试耗尽时,RetryOperations 可以将控制传递给另一个回调,即 RecoveryCallback。Spring-Retry 还提供了 @Recover 注解,用于 @Retryable 重试失败后处理方法。若不需要重试失败后的处理方法,则不写回调方法,重试耗尽后抛出异常。

@Recover
public String recoverTest(RuntimeException e) {
    return "回调方法-" + e.getMessage();
}
  • 方法的返回值必须与 @Retryable 方法一致
  • 方法的第一个参数,必须是 Throwable 类型的,建议是与 @Retryable 配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover 方法中有的)
  • 该回调方法与重试方法写在同一个实现类里面

若同一个实现类中有多个回调方法,我们需要使用 recover 属性指定回调的方法名

@Component
public class TestRetry {

    int a = 0;

    @Retryable(recover = "recoverTest1", value = {RuntimeException.class}, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    public String test() {
        a++;
        System.out.println(a + " - " + System.currentTimeMillis());
        if (a < 10) {
            throw new RuntimeException("未满足条件");
        }
        return "执行成功";
    }

    @Recover
    public String recoverTest(RuntimeException e) {
        return "回调方法-" + e.getMessage();
    }

    @Recover
    public String recoverTest1(RuntimeException e) {
        return "回调方法1-" + e.getMessage();
    }
}

指定了回调方法为 recoverTest1

5、注意事项

  • 由于是基于 AOP 实现,所以不支持类里自调用方法
  • 如果重试失败需要给 @Recover 注解的方法做后续处理,那这个重试的方法不能有返回值,只能是 void
  • 方法内不能使用 try catch,只能往外抛异常
  • @Recover 注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是 @Retryable 抛出的异常,否则无法识别,可以在该方法中进行日志处理。

作者:Asurplus

来源:blog.csdn.net/qq_40065776/article/

details/129069455

推荐

Java面试题宝典

技术内卷群,一起来学习!!

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

相关阅读

  • 西门吹雪实盘周报20230212

  • 点击上方『西门吹雪实盘』可关注并“星标”本号。文章仅记录西门个人投资思考和交易,不构成投资建议,作者不收费荐股、不代客理财。“这是西门吹雪的第411篇原创文章”前言本
  • 洋河股份招股书笔记

  • 前言上周学习完古井贡酒的招股书后,本周学习洋河股份的招股说明书。古井招股书学习笔记|古井贡酒AB股详细对比分析不看不知道,一看吓一跳,招股说明书竟然有洋洋洒洒的295页。遂
  • 手把手教你计算公司上市以来的年化收益率

  • “这是西门吹雪的第414篇原创文章”前言最近两周在财报群的时候,很多小伙伴提出XX公司上市以来,年化收益率是多少?西门有简单地给出了计算的方法,避免后面还有朋友继续问这个问
  • 恭喜您!天23转债中签了!速来查!

  • 点击上方『西门吹雪实盘』可关注并“星标”本号。文章仅记录西门个人投资思考和交易,不构成投资建议,作者不收费荐股、不代客理财。“这是西门吹雪的第415篇原创文章”大家可
  • 跟车E大2年的这个品种,西门今天清仓了

  • 点击上方『西门吹雪实盘』可关注并“星标”本号。文章仅记录西门个人投资思考和交易,不构成投资建议,作者不收费荐股、不代客理财。“这是西门吹雪的第416篇原创文章”大家可
  • E大的这个品种异常终止,ETF拆分后的网格设置

  • 点击上方『西门吹雪实盘』可关注并“星标”本号。文章仅记录西门个人投资思考和交易,不构成投资建议,作者不收费荐股、不代客理财。“这是西门吹雪的第417篇原创文章”大家可
  • 吃大面!加仓!

  • 点击上方『西门吹雪实盘』可关注并“星标”本号。文章仅记录西门个人投资思考和交易,不构成投资建议,作者不收费荐股、不代客理财。“这是西门吹雪的第418篇原创文章”大家可

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • SpringBoot 中使用 spring-retry 轻松解决重试

  • 在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为
  • 大额活期3.85%

  • 麻将银行的转让区,居然一个转让单都没有真是牛逼的很啊,想抢都没有机会麻将银行的大额存单,3.85%,20万起投,非常适合本金大的读者,理由如下:1、银监会备案的产品,额度极其有限,比普通
  • 烦恼

  • 中午,爸爸妈妈、弟弟弟媳来我这边,一大家子,吃个饭在同一个小区,很方便煮火锅吃,不费事祖孙三代围在一张桌上吃饭,其乐融融,有说有笑稍微有点挤,我端个碗,坐在边边上,不说话,就笑盈盈得
  • 嗅到危机

  • 不知道为什么最近,越来越多的信息,指向了监管力度这一波监管,可能强于以往任何一次行动1、有银行,已经进入1级戒备状态所有异地用户,白名单都取消了,无论历史开白的,还是最近开白的
  • (待会删)yyds,大家低调浏览!!!

  • 据外媒报道,微软宣布将在3月底前裁员1万名员工,约占员工总数的5%。1月20日,Google突然宣布裁员12000人,占员工总数6%。《华尔街日报》1月26日报道,IBM加入了裁员大军,将裁员约3900
  • 彻底熄火

  • 凉凉了硅谷银行,白名单于2月15日(今晚)凌晨开始,全面下架无论新户还是老户,好产品统统下架周期7天3.8%,周期3月4%,真金白银最后的尊严,都卸下了之前还有群友信誓旦旦地说,我,王境泽,就