使用Spring-Retry时是否必须配置Recovery方法?
Spring-Retry是否必须配置Recovery方法?
咱们先明确核心结论:不是必须的,是否需要配置Recovery方法完全取决于你的业务需求。
1. 无Recovery方法时的默认行为
在你提供的代码示例中,@Retryable注解指定了maxAttempts = 2(初始调用+1次重试,共2次尝试)。当所有重试都失败后,如果没有配置Recovery方法,Spring-Retry会直接抛出最后一次触发的异常(也就是你的KnownException),这个异常会被上层调用者(比如控制器)捕获并处理。
举个场景:如果你的控制器层已经有全局异常处理逻辑,能妥善处理KnownException,那完全不需要额外配置Recovery方法,直接让异常正常抛出即可。
2. 什么时候需要Recovery方法?
当你希望重试失败后执行兜底逻辑时,才需要配置Recovery方法。比如:
- 返回一个默认值给调用方,避免接口报错
- 记录详细的失败日志,便于后续排查
- 执行一些补偿操作(比如通知运维、标记任务状态等)
配置Recovery方法有两种常见方式:
方式一:在@Retryable中指定recover属性
修改你的TestService接口:
public interface TestService{ @Retryable( value = { KnownException.class }, backoff = @Backoff(delay = 1000), maxAttempts = 2, recover = "recoverAddress" // 指定Recovery方法名 ) Address getAddress(String emailAddress); }
然后在实现类TestServiceImpl中实现对应的方法:
public Address recoverAddress(KnownException e, String emailAddress) { // 这里写兜底逻辑,比如返回默认地址 log.error("获取地址重试失败,邮箱:{}", emailAddress, e); return new Address("默认街道", "默认城市"); }
方式二:用@Recover注解标记方法
不需要修改@Retryable的属性,直接在实现类中添加带有@Recover注解的方法,方法参数需要包含重试失败的异常,以及原方法的参数(顺序要对应):
@Recover public Address recover(KnownException e, String emailAddress) { log.error("获取地址重试失败,邮箱:{}", emailAddress, e); return new Address("默认街道", "默认城市"); }
Spring-Retry会自动识别这个方法作为Recovery逻辑。
总结
- 如果业务允许重试失败后抛出异常,由上层处理:不需要配置Recovery方法
- 如果需要重试失败后执行兜底操作:必须配置Recovery方法(两种方式二选一即可)
内容的提问来源于stack exchange,提问作者Vipin Menon
相关产品推荐
相关产品推荐

