从Mono.first发出第一个成功的结果

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

我有两个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为...

java spring-webflux project-reactor
1个回答
0
投票

代替.onErrorResume(e -> Mono.never());,使用.onErrorResume(e -> Mono.empty());。然后,您可以使用:

Flux.merge(mono0, mono1).next();
© www.soinside.com 2019 - 2024. All rights reserved.