Webflux: 重复次数用尽后的OnErrorResume没有被触发。

问题描述 投票:0回答:1

我试图在重复耗尽后用以下方法执行代码 onErrorResume 但onErrorResume没有被触发。

以下是代码示例

Mono.just(request)
                .filter(this::isConditionSatified)
                .map(aBoolean -> performSomeOperationIfConditionIsSatified(request))
                .repeatWhenEmpty(Repeat.onlyIf(i -> true)
                        .exponentialBackoff(Duration.ofSeconds(5)), Duration.ofSeconds(10))
                        .timeout(Duration.ofSeconds(30)))
                .delaySubscription(Duration.ofSeconds(10)))
                .onErrorResume(throwable -> {
                    log.warn("Max timeout reached", throwable);
                    return Mono.just(false);
                });

onErrorResume 永远不会被触发。我试图用它作为一个后备方案。我的目标是,如果重复耗尽被击中,就返回这个 false 值。

我的单元测试抱怨

expectation "expectNext(false)" failed (expected: onNext(false); actual: onComplete())

任何帮助或建议都会有帮助。

reactive-programming spring-webflux project-reactor reactor reactive-streams
1个回答
1
投票

因为一个 empty 源本身是有效的。repeatWhenEmpty 不一定会在用尽尝试后传播异常。异常的 Repeat 的util不会,即使当 "超时 "触发时也不会(正如在 timeout 参数的javadoc。"超时后不会再有新的重复请求",好吧,可以说得更清楚一些)。)

因为你使用的是 repeatWhenEMPTY我猜想,空箱对你来说总是 "无关紧要 "的,因此...。defaultIfEmpty(false) 应是可接受的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.