gpt4 book ai didi

java - react 堆重试不调用要重试的方法

转载 作者:行者123 更新时间:2023-11-30 01:45:38 25 4
gpt4 key购买 nike

我有一个总是返回Mono.error的方法

private Mono<String> doSomething() {
System.out.println("doSomething");
return Mono.error(new Error());
}

我尝试重试执行3次

Mono<String> mono =
myClass.doSomething()
.doOnSubscribe(x -> System.out.println("Subscribe"))
.retryWhen(companion -> companion
.doOnNext(s -> System.out.println(s + " at " + LocalTime.now()))
.zipWith(Flux.range(1, 4), (error, index) -> {
if (index < 4) return index;
else throw Exceptions.propagate(error);
})
.flatMap(index -> Mono.delay(Duration.ofMillis(index * 100)))
.doOnNext(s -> System.out.println("retried at " + LocalTime.now()))
);

mono.block();

但是,doSomething 只打印一次,而 Subscribe 打印了 4 次(开始时 1 次,重试 3 次)

如何在不执行该方法的情况下重新订阅?

我想做的是在每次重试时执行doSomething

最佳答案

要在每次重试时执行 doSomething,您可以使用 defer运算符与 retryWhen 结合使用:

Mono.defer(() -> myClass.doSomething()
.doOnSubscribe(x -> System.out.println("Subscribe")))
.retryWhen(// rest of the code

基本上,retryWhen运算符通过重新订阅 Mono 源来工作,以及 defer每次有新订阅时,运算符都会重新计算 lambda。因此,最终您会得到所需的行为。

关于java - react 堆重试不调用要重试的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58104673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com