如何获取Spring Retry中当前的重试间隔值?
如何获取Spring Retry中当前的重试间隔值?
这个问题问得很实用!虽然RetryContext本身没有直接提供获取当前重试间隔的API,但我们可以通过访问它存储的退避策略上下文对象来拿到这个值,完全不需要自己根据重试次数手动计算。
具体来说,当你用RetryTemplate.builder()配置指数退避时,Spring Retry会把对应退避策略的上下文实例(这里是ExponentialBackOffPolicy.ExponentialBackOffContext)存到RetryContext的属性中,我们只需要用特定的key取出这个对象,就能从中获取当前的间隔值了。
修改你的MyRetryListener代码如下:
import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; import org.springframework.retry.RetryListener; import org.springframework.retry.backoff.ExponentialBackOffPolicy; public class MyRetryListener implements RetryListener { @Override public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) { int retryCount = context.getRetryCount(); System.out.println("Current retryCount: " + retryCount); // 从RetryContext中获取指数退避的上下文对象 ExponentialBackOffPolicy.ExponentialBackOffContext backOffContext = (ExponentialBackOffPolicy.ExponentialBackOffContext) context.getAttribute("backOffContext"); if (backOffContext != null) { // 获取当前的重试间隔值 long currentInterval = backOffContext.getCurrentInterval(); System.out.println("Current retry interval: " + currentInterval + "ms"); } } }
一些需要注意的点:
- 这里用到的key
"backOffContext"是Spring Retry内部约定的退避上下文存储键,是框架通用的定义,你可以在BackOffRetryOperationsInterceptor或RetryTemplate的相关实现中找到它的来源。 - 类型转换要注意安全性:如果你后续更换了退避策略(比如改成固定间隔),对应的上下文类型会变成
FixedBackOffPolicy.FixedBackOffContext,这时候需要调整类型转换的代码,或者加上类型检查避免运行时异常。 getCurrentInterval()返回的是下一次重试前要等待的间隔时间,和当前的重试次数是完全匹配的(比如第3次重试触发时,这个值就是本次重试后要等待的间隔)。
备注:内容来源于stack exchange,提问作者Georgii Lvov
相关产品推荐
相关产品推荐

