Spring Boot中@Retryable注解未触发重试,求排查建议
Spring Retry重试逻辑未触发的排查建议
修正方法访问修饰符
Spring Retry基于Spring AOP实现,而Spring AOP默认仅能代理public方法,private方法无法被AOP拦截,自然不会触发重试逻辑。直接将execute方法的修饰符改为public即可。校验自定义异常配置
- 确认
customeExcep是合法的异常类(需继承Throwable,通常继承Exception或RuntimeException)。 - 检查抛出的异常实例确实是
customeExcep类型,而非其子类或其他异常;如果是子类异常,需要在@Retryable的value或include属性中明确指定。
- 确认
验证Spring Bean与AOP代理有效性
- 确保
execute方法所在类被Spring管理(即标注@Component/@Service等注解,且被Spring扫描到)。 - 避免同一类内部直接调用
execute方法,这种内部调用无法被Spring AOP拦截,需通过类自身的代理对象调用,或改用AspectJ编译/加载时织入。
- 确保
检查@Retryable注解配置细节
- 确认参数配置逻辑:
maxAttempts=5代表包含首次调用共执行5次,实际重试4次;backoff.delay=1是1毫秒间隔,可能因间隔太短导致视觉上无感知,可临时调大至delay=1000验证。 - 核对注解属性是否写错,比如异常类的全类名是否正确,是否误将
value属性写为其他字段。
- 确认参数配置逻辑:
排查依赖版本兼容性
检查spring-retry:1.3.4与当前Spring Boot版本是否兼容,不同版本的Spring Boot对spring-retry有对应的依赖版本要求,版本不匹配可能导致AOP拦截失效。开启调试日志定位问题
添加日志配置开启Spring Retry和AOP的调试日志:logging.level.org.springframework.retry=DEBUG logging.level.org.springframework.aop=DEBUG通过日志可查看AOP代理是否创建、重试逻辑是否被触发,以及异常是否被正确捕获。
内容的提问来源于stack exchange,提问作者Anushka
相关产品推荐
相关产品推荐

