10.1 Java反应流简介

本章开头介绍了反应流的定义、标准构成元素以及这些元素在Java中的实现方式。

  • Flow.Publisher接口:该接口描述了条目的生产者。
  • Flow.Subscriber接口:该接口描述了条目的使用者(即消费者)。
  • Flow.Subscription接口:该接口描述了生产者与消费者之间的连接。实现该接口的类可以管理生产者和消费者之间的条目交换。

除了这三个接口之外,还有实现Flow.Publisher接口的SubmissionPublisher类。该类还用到了Flow.Subscription接口的一个实现。该类实现了Flow.Publisher接口的方法,进而可以支持消费者订阅,也可以将条目发送给这些消费者,因此我们只需要实现一个或多个实现Flow.Subscriber接口的类。

下面详细了解一下这些类和接口所提供的方法。

10.1.1 Flow.Publisher接口

如前所述,该接口描述了条目的生产者。它只提供一个方法。

  • subscribe():该方法接收Flow.Subscriber接口的一个实现作为参数,并且将该订阅者添加到其内部订阅者列表。该方法并不返回任何结果。从内部来看,它使用Flow.Subscriber接口提供的方法向订阅者发送条目、错误信息和订阅对象。

10.1.2 Flow.Subscriber接口

如前所述,该接口描述了条目的消费者。它提供了下述四个方法。

  • onSubscribe():该方法由发布者调用,用于完成订阅者的订阅过程。它向订阅者发送了Flow.Subscription对象,该对象管理发布者和订阅者之间的通信。
  • onNext():当发布者想把新条目发送给订阅者时,会调用该方法。在该方法中,订阅者必须处理该条目。该方法并不返回任何结果。
  • onError():如果出现了一个不可恢复的错误,而且没有调用其他的订阅者方法,那么发布者将调用该方法。该方法接收Throwable对象作为参数,其中含有已发生的错误。
  • onComplete():不再发送任何条目时,发布者将调用该方法。该方法没有参数,也不返回结果。

10.1.3 Flow.Subscription接口

如前所述,该对象描述了发布者与订阅者之间的通信。它提供了两个方法,订阅者可以通过这些方法告诉发布者它们的通信将如何进行。

  • cancel():订阅者调用该方法告诉发布者它不再需要任何条目了。
  • request():订阅者调用该方法来告诉发布者它需要更多的条目。它将订阅者想要的条目数作为参数。

10.1.4 SubmissionPublisher

如前所述,这个类由Java 9 API提供,实现了Flow.Publisher接口。它还使用Flow.Subscription接口,并且提供向消费者发送条目的方法,这些方法用于了解消费者数量、发布者和消费者之间的订阅关系,以及关闭它们之间的通信。下面给出了该类比较重要的方法。

  • subscribe():该方法由Flow.Publisher接口提供,用于向发布者订阅一个Flow.Subscriber对象。
  • offer():该方法以异步方式调用其onNext()方法,向每个订阅者发布一个条目。
  • submit():该方法以异步方式调用其onNext()方法,向每个订阅者发布一个条目。资源对任何订阅者都不可用时,进行不间断阻塞。
  • estimateMaximumLag():该方法对发布者已生成但尚未被已订阅的订阅者使用的条目进行估计。
  • estimateMinimumDemand():该方法对消费者已请求但是发布者尚未生成的条目数进行估计。
  • getMaxBufferCapacity():该方法返回每个订阅者的最大缓冲区。
  • getNumberOfSubscribers():该方法返回订阅者的数量。
  • hasSubscribers():该方法返回一个布尔值,该值用于指示发布者是否有订阅者。
  • close():该方法调用当前发布者的所有订阅者的onComplete()方法。
  • isClosed():该方法返回一个布尔值,用于指示当前发布者是否已关闭。