Spring Webflux块,平面图和订阅之间的区别

时间:2018-10-10 16:01:52

标签: spring-webflux

我有一个api,它需要调用其他3个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));
      } 
});

尽管似乎不建议这样做,但我也尝试过阻止:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

block操作,实质上停止并等待。这将等效于Java中的Future.get()。它违反了非阻塞代码的目的。 Flatmap将序列序列展平为单个序列,因此列表{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()));