Flow API ใน Java 9 สอดคล้องกับข้อกำหนด Reactive Streams ซึ่งเป็นมาตรฐาน de facto ประกอบด้วยชุดอินเทอร์เฟซขั้นต่ำที่จับหัวใจของการเผยแพร่และการสมัครรับแบบอะซิงโครนัส
อินเทอร์เฟซสำคัญของ Flow API:
1) Flow.Publisher: ผลิตไอเทมให้ Subscriber รับประทาน มีเพียงเมธอดเดียว: subscribe(Subscriber)
void subscribe(Flow.Subscriber<? super T> subscriber)
2) Flow.Subscriber: สมัครรับจาก Publisher (ปกติเพียงตัวเดียว) เพื่อรับไอเทม (ผ่าน onNext(T)), ข้อความข้อผิดพลาด (onError(Throwable)), หรือสัญญาณว่าไม่มีไอเทมเพิ่มเติม (onComplete()) ก่อนที่จะเกิดเหตุการณ์เหล่านี้ Publisher จะเรียกเมธอด onSubscription(Subscription)
void onSubscribe(Flow.Subscription subscription)
void onNext(T item)
void onError(Throwable throwable)
void onComplete()
3) Flow.Subscription: การเชื่อมต่อระหว่าง Publisher เดียวและ Subscriber เดียว Subscriber ใช้มันขอไอเทมเพิ่ม (request(long)) หรือตัดการเชื่อมต่อ (cancel())
void request(long n)
void cancel()
ขั้นตอนการรัน Flow API:
- สร้าง Publisher และ Subscriber ก่อน
- สมัคร Subscriber ด้วย Publisher::subscribe
- Publisher สร้าง Subscription และเรียก Subscriber::onSubscription พร้อมมัน เพื่อให้ Subscriber เก็บ subscription ไว้
- Subscriber เรียก Subscription::request เพื่อขอจำนวนไอเทม
- Publisher เริ่มส่งไอเทมให้ Subscriber ผ่าน Subscriber::onNext ไม่เคยส่งมากกว่าจำนวนที่ขอ
- Publisher อาจเจอปัญหาและเรียก Subscriber::onComplete หรือ Subscriber::onError ตามลำดับ
- Subscriber อาจขอไอเทมเพิ่มต่อไป หรือตัดการเชื่อมต่อด้วย Subscription::cancel