Java 9 นำเสนอ Reactive Streams ภายใต้ package java.util.concurrent.Flow รองรับ framework publish-subscribe ที่ interoperable ประมวลผล asynchronous stream of data ข้าม asynchronous boundary (ส่ง elements เข้า thread หรือ thread pool อื่น) ด้านรับไม่ถูกบังคับให้ buffer ข้อมูลจำนวนมาก จึงไม่เกิด buffer overflow
4 Core Interfaces ของ Flow API
- Publisher - ผู้เผยแพร่ข้อมูล
- Subscriber - ผู้สมัครรับข้อมูล
- Subscription - ลิงก์ระหว่าง Publisher และ Subscriber
- Processor - ตัวประมวลผลแปลงสตรีม (implements Publisher และ Subscriber)
ไวยากรณ์ของ Interfaces
@FunctionalInterface
public static interface Publisher<T> {
public void subscribe(Subscriber<? super T> subscriber);
}
public static interface Subscriber<T> {
public void onSubscribe(Subscription subscription);
public void onNext(T item);
public void onError(Throwable throwable);
public void onComplete();
}
public static interface Subscription {
public void request(long n);
public void cancel();
}
public static interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
ความสัมพันธ์และการทำงาน
| Interface | เมธอดหลัก | หน้าที่ |
|---|---|---|
| Publisher | subscribe() | ลงทะเบียน Subscriber เริ่มสตรีม |
| Subscriber | onSubscribe() | รับ Subscription เรียก request() ขอข้อมูล |
| Subscriber | onNext() | รับข้อมูล item ถัดไป |
| Subscriber | onError() | รับข้อผิดพลาด |
| Subscriber | onComplete() | สตรีมจบสมบูรณ์ |
| Subscription | request(n) | ขอ n items (backpressure) |
| Subscription | cancel() | ยกเลิก subscription |
| Processor | (ทั้ง Publisher และ Subscriber) | แปลงสตรีม input เป็น output |
หลักการ Reactive Streams
- Backpressure: Subscriber ควบคุมอัตราการรับด้วย request(n)
- Non-blocking: การทำงานแบบ asynchronous
- Interoperability: ระหว่าง libraries ต่างๆ ที่ implement Flow API
Flow API เป็นมาตรฐานพื้นฐาน ไลบรารีอย่าง RxJava, Reactor, Akka Streams สามารถทำงานร่วมกันได้