Spring webflux block、flatmap 和 subscribe 的区别

2024-02-04

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

我对执行此操作的最佳方法以及使用块、订阅和平面地图之间的区别有点困惑。所有这 3 种方法都适合我,但我不确定哪一种是最好的。

这就是我目前所拥有的:

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));
      } 
});

我也尝试过阻止,尽管这似乎不鼓励:

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

我也尝试过平面地图,尽管这迫使你返回一些东西:

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

感谢对上述代码的任何帮助和反馈。


block操作,本质上是停止和等待。它相当于java中的Future.get()。它违背了非阻塞代码的目的。Flatmap将一系列序列展平为单个序列,因此 List {List{?}} 将变成 list{Object}。subscribe本质上开始倾听,并且可以采取行动。通常在订阅之前不会发生任何事情。

但对于您的用例,您可以使用filter这是一个例子, 它看起来会过滤 {true, false} 项,然后对于每个 true 过滤器, 我将两个单声道的结果压缩在一起,然后通过操作进行订阅

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()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring webflux block、flatmap 和 subscribe 的区别 的相关文章

随机推荐