• springboot @Retryable springretry


    @Retryable是什么?

    spring系列的spring-retry是另一个实用程序模块,可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释的。

    POM依赖

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

    启用@Retryable

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

    在方法上添加@Retryable

    @Slf4j
    @Service
    public class TestRetryServiceImpl implements TestRetryService {
    
        @Override
        @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))
        public int test(int code) throws Exception {
            log.info("test被调用,时间:" + LocalTime.now());
            if (code == 0) {
                throw new Exception("异常!");
            }
            log.info("test被调用!");
    
            return 200;
        }
    
    }
    
    • value:抛出指定异常才会重试
    • include:和value一样,默认为空,当exclude也为空时,默认所有异常
    • exclude:指定不处理的异常
    • maxAttempts:最大重试次数,默认3次
    • backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

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

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

    @Recover

        @Recover
        public int recover(Exception e, int code) {
            log.info("回调方法执行!!!!");
            return 400;
        }
    

    可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。对于@Recover注解的方法,需要特别注意的是:

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

    文章来源: https://blog.csdn.net/h254931252/article/details/109257998

  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/ooo0/p/16203668.html
Copyright © 2020-2023  润新知