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在每次重试时执行
要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。所以,最后你会得到想要的行为。
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |