美文网首页web常用技能spring bootJava 程序员
Spring @Retryable实现接口自动重试

Spring @Retryable实现接口自动重试

作者: 程序花生 | 来源:发表于2021-04-27 22:41 被阅读0次

    背景: 在实际项目中,我们在与其他第三方业务接口进行交互时,可能会因为一些网络波动导致超时失败,但是并不能只一次失败就判定接口请求失败,应该考虑重试多次后如果仍然失败,才返回请求失败。

    解决方案:

    解决方案一:try-catch 简单重试

    通过判断返回结果或监听异常判定是否重试,同时为了解决立即重试的无效执行(假设异常是有外部执行不稳定导致的),休眠一定延迟时间重新执行功能逻辑。

    但是这样会存在一个问题,那就是如果是请求参数不正常,那么就会一直重试下去,变成了死循环。

    这样肯定不是我们想要的解决方案,所以我们需要添加限制,判断重试多少次以后仍然失败,就返回失败结果。

    然后这次再看执行结果,这次就按照我们设置的次数进行重试了,已经达到了业务需求

    结论:try-catch再加上提前设定重试次数,这样已可以满足我们重试机制了,但是有没有更简单的方法呢?答案是肯定的。

    解决方案二:Spring @Retryable 注解实现

    @Retryable是Spring提供的可重试注解,为了使用spring提供的重试机制

    在pom文件中添加相应的依赖

    <!-- spring retry 自动重试机制-->
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.2.4.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
    <!-- spring retry 自动重试机制-->
    

    启动类添加注解

    @EnableRetry
    

    在需要重试的方法上添加注解@Retryable

    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    

    然后继续执行测试方法、结果发现执行了三次,然后输出请求失败语句。

    但是只是这样并不满足我们实际业务,在实际业务中如果超过重试之后,一般需要记录本次失败原因,并且调用补偿方法进行业务处理,与消息推送,所以我们可以使用@Recover注解来实现超出重试次数后执行补偿方法。

    但是这里需要注意的是,@Recover声明的方法必须与@Retryable声明的方法返回值一致,不然补偿方法会不生效。

    以下是Spring自动重试注解的说明

    @Retryable注解中的参数说明:
    
    maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
    value:抛出指定异常才会重试
    include:和value一样,默认为空,当exclude也为空时,默认所以异常
    exclude:指定不处理的异常
    backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,我们设置为2000L。
    
    @Backoff注解中的参数说明:
    
    value:隔多少毫秒后重试,默认为1000L,我们设置为3000L;
    delay:和value一样,但是默认为0;
    multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,
    则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
    

    如果对您有帮助 请点个关注,万分感谢

    作者:大耳根图图
    链接:https://juejin.cn/post/6955786146215362568
    来源:掘金

    相关文章

      网友评论

        本文标题:Spring @Retryable实现接口自动重试

        本文链接:https://www.haomeiwen.com/subject/ynqmrltx.html