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
相关产品推荐
相关产品推荐

