区块、平面地图和订阅之间的春季Web流量差异 [英] Spring webflux difference between block, flatmap and subscribe

查看:10
本文介绍了区块、平面地图和订阅之间的春季Web流量差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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{?}}将变为列表{Object}。 subscribe实质上开始监听,并可以执行操作。通常在订阅之前什么都不会发生。

但是对于您的用例,您可以使用以下示例, 它对{True,False}项进行筛选,然后对于每个为真的筛选器, 我将两个单声道的结果压缩在一起,然后通过操作订阅

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

这篇关于区块、平面地图和订阅之间的春季Web流量差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆