如何在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.