Boot 4 里 Spring Retry 还能用吗?Framework 7 内置的 @Retryable 与它同名,次数怎么算?import 选错、@Enable 选错会怎样?缺 AspectJ 会怎样?这篇在 Spring Boot 4.0.8 上逐个运行。
Boot 3.5.16:受管理,版本 2.0.13 Boot 4.0.8:受管理,版本 2.0.13
spring-retry 在 Boot 4.0.8 里仍受管理,版本 2.0.13。
与重试相关的 Bean 定义:[RetryConfiguration] 最后抛出 IllegalStateException:fail 3 方法被调用 3 次;bean 类型 代理(SvcR$$…)
maxAttempts = 3,调用 3 次。
与重试相关的 Bean 定义:[ResilientMethodsConfiguration, internalConcurrencyLimitProcessor, internalRetryAnnotationProcessor] 最后抛出 IllegalStateException:fail 4 方法被调用 4 次;bean 类型 代理(SvcF$$…)
maxRetries = 3,调用 4 次。
与重试相关的 Bean 定义:[RetryConfiguration] 最后抛出 IllegalStateException:fail 1 方法被调用 1 次;bean 类型 原始类,没有被代理 -- 反过来:Spring Retry 的 @Retryable 配 @EnableResilientMethods(没配 @EnableRetry) 与重试相关的 Bean 定义:[ResilientMethodsConfiguration, internalConcurrencyLimitProcessor, internalRetryAnnotationProcessor] 最后抛出 IllegalStateException:fail 1 方法被调用 1 次;bean 类型 原始类,没有被代理
只调用 1 次,没有代理,没有报错。
与重试相关的 Bean 定义:[] 最后抛出 IllegalStateException:fail 1 方法被调用 1 次;bean 类型 原始类,没有被代理 -- Framework 注解的方法,什么都不启用 与重试相关的 Bean 定义:[] 最后抛出 IllegalStateException:fail 1 方法被调用 1 次;bean 类型 原始类,没有被代理
结果与用错注解相同,要看 Bean 是不是代理。
与重试相关的 Bean 定义:[ResilientMethodsConfiguration, RetryConfiguration, internalConcurrencyLimitProcessor, internalRetryAnnotationProcessor] 最后抛出 IllegalStateException:fail 3 方法被调用 3 次;bean 类型 代理(SvcR$$…) -- 同一份配置调用 Framework 注解的方法 与重试相关的 Bean 定义:[ResilientMethodsConfiguration, RetryConfiguration, internalConcurrencyLimitProcessor, internalRetryAnnotationProcessor] 最后抛出 IllegalStateException:fail 4 方法被调用 4 次;bean 类型 代理(SvcF$$…)
两套机制各按各的规则。
启动失败 ClassNotFoundException:org.aspectj.lang.annotation.Pointcut -- 同样没有 aspectj,Framework 的 @EnableResilientMethods 与重试相关的 Bean 定义:[ResilientMethodsConfiguration, internalConcurrencyLimitProcessor, internalRetryAnnotationProcessor] 最后抛出 IllegalStateException:fail 4 方法被调用 4 次;bean 类型 代理(SvcF$$…)
Spring Retry 启动失败,Framework 7 的不受影响。