You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:23:02