【问题标题】:Mono<List<T>> difference with Flux<T> in Spring webfluxSpring webflux 中 Mono<List<T>> 与 Flux<T> 的区别
【发布时间】:2019-03-26 09:33:27
【问题描述】:

我的理解是Mono&lt;List&lt;T&gt;&gt; 是同步的Flux&lt;T&gt; 并且 Flux 不能是一个 rest api 响应。

我说的对吗?

如果不是,Mono&lt;List&lt;T&gt;&gt;Flux&lt;T&gt; 有什么区别 或者 Flux 可能是某个地方的休息 api 响应?

【问题讨论】:

    标签: spring-webflux reactor


    【解决方案1】:
    • 作为返回类型,Mono&lt;List&lt;T&gt;&gt; 意味着您将一次异步获得T 元素的完整列表。
    • Flux&lt;T&gt; 意味着您将获得零到多个 T 元素,可能会一个一个地出现。

    如果您从 HTTP 客户端获取此类返回类型,例如 WebClientMono&lt;List&lt;T&gt;&gt;Flux&lt;T&gt; 从运行时的角度来看可能或多或少是等效的,如果返回的 Content-Type 是例如 @987654329 @。在这种情况下,解码器将一次性反序列化响应。唯一不同的是,Flux&lt;T&gt; 提供了更多有趣的运算符,您可以随时使用collectList 并回退到Mono&lt;List&gt;

    另一方面,如果返回的Content-Type 是流式传输的,例如"application/stream+json",那么这肯定会产生影响,因为您将逐个获取元素。事实上,如果返回的流是无限的,选择Flux&lt;T&gt; 非常重要,因为另一个永远不会完成。

    【讨论】:

      【解决方案2】:
      • Mono&lt;List&lt;T&gt;&gt; 将发出零个或最多一个 T 类型的项目列表。
      • Flux&lt;T&gt;将发出零个或多个 T 类型的项目

      Momo 换行是有界的,Flux 不是。

      Mono&lt;List&lt;T&gt;&gt; 是一个同步的 Flux

      Mono 和 Flux 都是在 Reactive Stream Specification 中指定的 Publisher 接口的 Reactor 实现。

      Reactor Mono 类: public abstract class Mono<T> implements Publisher<T> {...}

      Reactor Mono 类: public abstract class Flux<T> implements Publisher<T> {...}

      Flux 不能是一个 rest api 响应。 当然Flux可以作为REST API的响应类型。通过使用 Flux 作为返回类型,您可以轻松地从异步处理切换到同步处理。如果您使用 Spring Boot,您甚至可以通过将 API 端点的 Content-Type 更改为 @Brian 提到的 application/stream+json 将数据流式传输给您的消费者。

      请注意,Flux 和 Mono 是非阻塞的,这意味着您可以更有效地使用工作线程(计算机资源)。

      【讨论】:

      • 如何将Mono&lt;List&lt;T&gt;&gt;转换为Flux&lt;T&gt;
      • 这个怎么样:mono.map(list -&gt; list.toArray(new T[0])) .flux() .flatMap(Flux::just);
      猜你喜欢
      • 1970-01-01
      • 2022-12-23
      • 2021-03-09
      • 1970-01-01
      • 2018-12-12
      • 2019-04-13
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多