Spring WebFlux中block、flatMap和subscribe的区别

7

我有一个api需要调用另外三个api,第二和第三个api的调用依赖于第一个api的结果。

我对最佳方法以及使用block、subscribe和flatmap之间的区别有些困惑。这三种方法都可以正常工作,但我不确定哪一种是最好的。

这是我目前的代码:

webClient1.getApi1(request.getId())
   .subscribe(api1Response -> {
      if (api1Response.hasData()) {
         Mono<ApiTwoResponse> monoTwo = webClient2
            .post()
            .syncBody(...)
            .bodyToMono(ApiTwoResponse.class)
         monoTwo.subscribe(two -> log.info(two));

         Mono<ApiThreeResponse> monoThree = webClient3
            .put()
            .syncBody(...)
            .bodyToMono(ApiThreeResponse.class)
         monoThree.subscribe(three -> log.info(three));
      } 
});

我也尝试过使用block,但似乎不被鼓励:

Api1Response response = webClient1.getApi1(request.getId()).block()

我也尝试了 flatmap,虽然它强制你返回一些东西:

webClient1.getApi1(request.getId())
   .flatmap(api1Response -> {
      ...
      return Mono.empty();
});

欢迎对以上代码提供帮助和反馈。

1个回答

3
block操作会阻止并等待执行完成,类似于Java中的Future.get()方法。这会破坏非阻塞代码的设计意图。 Flatmap可以将嵌套列表扁平化为一个单一的列表,例如:List {List{?}} 将变成一个包含Object的单一列表。 subscribe实际上是开始监听,并可以执行一些操作。通常情况下,只有在subscribe之后才会发生任何事情。
对于你的使用案例,你可以使用filter来过滤数据,以下是一个示例: 该示例对真假值进行筛选,对于每个筛选结果为true的项, 我将两个mono的结果合并后进行订阅操作。
Flux<Boolean> bool = Flux.just(true, false);
    Mono<Integer> mono1 = Mono.just(1);
    Mono<String> mono2 = Mono.just("string");

    bool.filter(b -> b)
            .flatMap(b -> Mono.zip(mono1, mono2))
            .subscribe(tuple -> System.out.println(tuple.getT1() + ", " + tuple.getT2()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接