反应堆重试不调用要重试的方法

Won*_*dem 1 java project-reactor

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

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

我尝试重试执行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();
Run Code Online (Sandbox Code Playgroud)

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

不执行该方法如何重新订阅?

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

Ole*_*kyi 5

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

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

基本上,retryWhen运算符通过重新订阅源来工作Mono,并且每次有新的 subscribedefer时运算符都会重新计算 lambda。所以,最后你会得到想要的行为。