如何在Java 9中实现Subscriber接口?


Java 9 支持通过引入几个接口来创建响应式流PublisherSubscriberSubscription 和实现Publisher 接口的SubmissionPublisher 类。每个接口都可以根据响应式流的原则扮演不同的角色。

我们可以使用Subscriber 接口来订阅由发布者发布的数据。我们需要实现Subscriber 接口并为抽象方法提供实现。

Flow.Subscriber 接口方法

  • onComplete():当Publisher对象完成其角色时,调用此方法。
  • onError():当Publisher出现错误并通知Subscriber时,调用此方法。
  • onNext():每当Publisher有新的信息需要通知所有Subscriber时,调用此方法。
  • onSubscribe():当Publisher添加Subscriber时,调用此方法。

示例

import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
import java.util.stream.IntStream;

public class SubscriberImplTest {
   public static class Subscriber implements Flow.Subscriber<Integer> {
      private Flow.Subscription subscription;
      private boolean isDone;
      
      @Override
      public void onSubscribe(Flow.Subscription subscription) {
         System.out.println("Subscribed");
         this.subscription = subscription;
         this.subscription.request(1);
      }
      @Override
      public void onNext(Integer item) {
         System.out.println("Processing " + item);
         this.subscription.request(1);
      }
      @Override
      public void onError(Throwable throwable) {
         throwable.printStackTrace();
      }
      @Override
      public void onComplete() {
         System.out.println("Processing done");
         isDone = true;
      }
   }
   public static void main(String args[]) throws InterruptedException {
      SubmissionPublisher<Integer> publisher = new SubmissionPublisher<>();
      Subscriber subscriber = new Subscriber();
      publisher.subscribe(subscriber);
      IntStream intData = IntStream.rangeClosed(1, 10);
      intData.forEach(publisher::submit);
      publisher.close();
      while(!subscriber.isDone) {
         Thread.sleep(10);
      }
      System.out.println("Done");
   }
}

输出

Subscribed
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9
Processing 10
Processing done
Done

更新于:2020年4月13日

718 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.