我有两个Mono
,它们返回404
或产生result
。
我如何将这两个Mono
结合在一起
result
一成功完成,就发出Mono
。>Optional.empty
一旦所有Mono
都产生404
或遇到任何其他错误就返回?我尝试过
Mono<Result> mono0 = client.get() .uri(uri1) .retrieve() .bodyToMono(Result.class) .onErrorResume(e -> Mono.never()); Mono<Result> mono1 = client.get() .uri(uri2) .retrieve() .bodyToMono(Result.class) .onErrorResume(e -> Mono.never()); return Mono.first(mono0, mono1) .blockOptional()
这种方法的问题是,如果两个
Mono
都产生错误,它永远不会完成...
我想我需要类似OnErrorDetach
....!?]的东西>
为了使问题更清楚,我创建了一个TestCase:
import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.Optional; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; class DummyTest { public Optional<String> getResult(Mono<String> m1, Mono<String> m2) { return Mono.first(m1, m2) // DoSomethingHere ?!??!? .blockOptional(); } @Test void testFirstSuccessfullAndSecondErrorMono() { Optional<String> result = getResult(Mono.just("Something"), Mono.error(new RuntimeException())); assertThat(result, is(Optional.of("Something"))); } @Test void testSecondSuccessfullAndFirstErrorMono() { Optional<String> result = getResult(Mono.error(new RuntimeException()), Mono.just("Something")); assertThat(result, is(Optional.of("Something"))); } @Test void testTwoErrorMonosYieldEmpty() { Optional<String> result = getResult(Mono.error(new RuntimeException()), Mono.error(new RuntimeException())); assertThat(result, is(Optional.empty())); } }
我有两个Monos,它们返回404或产生结果。如何将这两个Monos结合起来,一旦Monos成功完成,就会发出结果。 Optional.empty为...
代替.onErrorResume(e -> Mono.never());
,使用.onErrorResume(e -> Mono.empty());
。然后,您可以使用:
Flux.merge(mono0, mono1).next();