响应式编程扩展
你当前正在浏览历史版本 Vert.x 4.3.8 的文档。 访问本页面的 最新版本。

Vert.x Reactive Streams 响应式流规范集成 (vertx-reactive-streams)

Reactive Streams(响应式流) 是一项旨在为 JVM 生态提供非阻塞背压(Back-pressure)异步流处理行业标准的开源倡议。

本组件为 Vert.x 提供了 Reactive Streams 标准规范的双向桥接实现。

Vert.x 核心层本身内置了成熟的数据流处理与基于背压的流抽吸(Pumping)机制,核心接口包括 io.vertx.core.streams.ReadStream、io.vertx.core.streams.WriteStream 以及 io.vertx.core.streams.Pump。有关 Vert.x 原生流处理的更多详情,请参阅 Vert.x Core 官方手册。

本模块提供了既实现 Vert.x ReadStream / WriteStream,又同时对接 Reactive Streams Publisher(发布者)与 Subscriber(订阅者)的适配器。通过该组件,你可以将任何第三方符合 Reactive Streams 规范的发布者或订阅者(如 Akka Streams、Project Reactor、RxJava 等)完全视作原生的 Vert.x 读写流来统一调度。

引入依赖

要在项目中使用 Vert.x Reactive Streams,请在构建描述文件中添加以下依赖:

  • Maven(在 pom.xml 中):

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-reactive-streams</artifactId>
  <version>5.0.12</version>
</dependency>
  • Gradle(在 build.gradle 文件中):

compile 'io.vertx:vertx-reactive-streams:5.0.12'

响应式读流 (Reactive Read Stream)

模块通过 ReactiveReadStream 提供了对 Vert.x ReadStream 接口的实现,该类同时实现了 Reactive Streams 的 Subscriber 接口。

你可以将其实例传递给任意 Reactive Streams Publisher(如 Akka 发布者),随后即可像操作任何标准 Vert.x ReadStream 一样消费数据(例如利用 pipeTo 或 Pump 将数据抽吸流转至目标 WriteStream):

以下示例展示了如何接收来自第三方响应式流发布者(如 Akka)的数据,并将其流式抽吸直接写入服务端 HTTP 响应体中。背压机制由 Vert.x 底层全自动协同处理:

ReactiveReadStream<Buffer> rrs = ReactiveReadStream.readStream();

// 将读流作为 Subscriber 订阅至第三方发布者:
otherPublisher.subscribe(rrs);

// 将读流直接通过管道传输至 HTTP 响应体:
rrs.pipeTo(response);

响应式写流 (Reactive Write Stream)

模块通过 ReactiveWriteStream 提供了对 Vert.x WriteStream 接口的实现,该类同时实现了 Reactive Streams 的 Publisher 接口。你可以将任何 Reactive Streams Subscriber(如 Akka 订阅者)接入其中,随后即可像向常规 Vert.x WriteStream 写入数据一样进行操作。

你可以像使用普通 Vert.x 读流一样,使用 pause、resume 以及 writeQueueFull 信号来调控背压。该机制在内部会自动转换为 Reactive Streams 标准的背压下发指令(向 Publisher 动态 request 更多数据项)。

以下示例展示了接收客户端上传的服务端 HTTP 请求流,并将其流式抽吸传输至第三方 Reactive Streams 订阅者中:

ReactiveWriteStream<Buffer> rws = ReactiveWriteStream.writeStream(vertx);

// 将第三方订阅者注册至写流发布者中:
rws.subscribe(otherSubscriber);

// 将 HTTP 请求体通过管道流式传输至写流:
request.pipeTo(rws);