SpringBoot(55) 整合spring-retry实现服务重试

2022-09-05 13:58:33

一、前言

本文将会基于springboot 2.4.0通过spring-retry实现服务重试

即方法A调用方法B,若因网络不稳定或其它原因导致调用失败,可通过配置来进行一定的重试策略,以及最终超过重试次数后的回调处理。

二、编程

1、pom.xml中引入依赖

<!-- spring-retry --><!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry --><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></dependency>

2、启用重试

@EnableRetry// 启用重试@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[] args){SpringApplication.run(DemoApplication.class, args);}}

3、测试代码

tips: 简单小示例看看效果~

@Slf4j@RestController@RequestMapping("")@Api(tags="测试重试")publicclassRetryController{/**
     * @Retryable 参数说明
     * value:抛出指定异常才会重试
     * maxAttempts:最大重试次数,默认3次
     * backoff:重试等待策略
     * recover:执行回调方法名称,必须在当前类中 -- tips:旧版本中无此参数,好像会自动对应失败回调方法
     */@ApiOperation("服务重试")@GetMapping("retryable")@SneakyThrows(Exception.class)@Retryable(value=RetryException.class, maxAttempts=3, backoff=@Backoff(delay=2000, multiplier=1.5), recover="recover")publicStringretry(@RequestParamString msg){
        log.info("test被调用,时间:"+DateTime.now());finalint a=3;int num=newSecureRandom().nextInt();if(num% a==0){
            log.info("服务调用正常!");return"OK";}
        log.info("服务调用不正常。。。");thrownewRetryException("服务调用不正常。。。");}@RecoverpublicStringrecover(RetryException e,String msg){
        log.info("执行回调方法: {}", msg);return"FAIL";}}

日志如下:
在这里插入图片描述

三、注意事项

@Retryable基于aop实现,因此需要注意失效场景,例如同一个类中调用方法

如果非要在同一个类中调用,可以通过BeanPostProcessor在目标对象中注入代理对象 -> 解决Spring AOP不拦截对象内部调用方法问题^_^

四、本文案例demo源码

https://gitee.com/zhengqingya/java-workspace


今日分享语句:
生活教会我们的第一件事就是:没有人可以宠你一辈子,要想走得精彩又坦荡,唯有独立坚强。新的一天开始了,替未来的你抱抱现在努力奋斗的自己!

  • 作者:郑清
  • 原文链接:https://zhengqing.blog.csdn.net/article/details/123985712
    更新时间:2022-09-05 13:58:33