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

Spring WebFlux中如何在doAfterRetry方法内判断重试是否成功?

问题核心说明

doAfterRetry回调本身就是每次重试尝试失败后才会触发的,所以你在这里永远拿不到failure() == null的情况——因为只有当当前重试尝试失败时,这个RetrySignal才会生成并传入回调。

如果要检测「最终重试成功」的场景,得换个思路,结合其他操作符实现,下面是两种可行方案:


方案一:用计数器记录重试次数,在成功回调中判断

通过原子计数器记录重试次数,后续在doOnSuccess里判断计数器是否大于0,就能知道是不是重试后成功的:

AtomicInteger retryAttempts = new AtomicInteger(0);

yourMono
    .retryWhen(Retry.backoff(3, Duration.ofSeconds(1))
        .doAfterRetry(signal -> {
            retryAttempts.incrementAndGet();
            log.warn("Retry failed (attempt {}), cause: {}", signal.totalRetries(), signal.failure().getMessage());
        }))
    .doOnSuccess(result -> {
        int attempts = retryAttempts.get();
        if (attempts > 0) {
            log.info("Succeeded after {} retry attempts", attempts);
        } else {
            log.info("Succeeded on first attempt");
        }
    })
    .subscribe();

方案二:结合doFinally与重试状态

如果需要在流结束时统一判断,可以用doFinally配合状态标记:

AtomicBoolean hasRetried = new AtomicBoolean(false);

yourMono
    .retryWhen(Retry.backoff(3, Duration.ofSeconds(1))
        .doAfterRetry(signal -> {
            hasRetried.set(true);
            log.warn("Retry failed, cause: {}", signal.failure().getMessage());
        }))
    .doFinally(signalType -> {
        if (signalType == SignalType.ON_COMPLETE && hasRetried.get()) {
            log.info("Retry succeeded eventually");
        }
    })
    .subscribe();

补充说明

  • RetrySignal里的failure()始终是导致当前重试尝试的异常,这个回调的触发逻辑就是「重试失败后执行」,所以它不可能为空。
  • 只有当整个重试策略耗尽所有尝试仍失败时,流才会抛出最终异常;如果某次重试成功,流就会继续往下走,不会再触发doAfterRetry。

内容的提问来源于stack exchange,提问作者Jan Olav Eide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:52:16