CodeBlanks Logo Icon CodeBlanks

Flow API

Java 9 Flow API ile reaktif akışı öğrenirsin.

Flow API

Java 9 ile birlikte Reactive Streams uygulamaya java.util.concurrent.Flow sınıfı üzerinden eklenmiştir. Bu API, asenkron veri akışını standart üç arayüzle tanımlar: Publisher veri üretir, Subscriber veri tüketir, Subscription akışı denetler.

Akışın yönü Publisher'dan Subscriber'a doğrudur; ancak Subscriber, request ile ne kadar veri istediğini bildirir. Bu, geri basınç (backpressure) olarak bilinir ve üreticinin tüketiciden hızlı olmasını engeller. Flow API, çerçevelerin ortak bir temel üzerinde buluşmasını sağlar.

Üç arayüzün görevi

Publisher'ın tek bir yöntemi vardır: subscribe(Subscriber). Bu, bir abone kaydeder. Subscriber ise dört yöntem taşır: onSubscribe Subscription'ı alır, onNext bir öğeyi alır, onError hatayı, onComplete akışın bittiğini bildirir.

Subscription ise request(n) ile n öğe ister ve cancel ile akışı iptal eder. Bu yapı, hem senkron hem asenkron uygulamaya izin verir. Önemli olan sözleşmedir; iletimin zamanlaması uygulamaya bağlıdır.

Uygulama Senkron Publisher ile veri gönder

Bir OnePublisher sınıfı tanımla: Publisher<String> arayüzünü uygulasın. subscribe yöntemi onSubscribe çağrısı yapsın; Subscription'ın request yöntemi s.onNext("merhaba") ve s.onComplete() çağrısı yapsın. main içinde new OnePublisher().subscribe(...) ile anonim bir Subscriber oluştur; onSubscribe request(1) yapsın, onNext System.out.println ile değeri yazdırsın.

Başlangıç kodu

Main.java
// OnePublisher sınıfını tanımla
// subscribe ve onNext ekle
// main içinde abone ol ve yazdır

Örnek çözüm

Main.java
import java.util.concurrent.Flow.*;

class OnePublisher implements Publisher<String> {
    public void subscribe(Subscriber<? super String> s) {
        s.onSubscribe(new Subscription() {
            public void request(long n) { s.onNext("merhaba"); s.onComplete(); }
            public void cancel() { }
        });
    }
}

public class FlowDemo {
    public static void main(String[] args) {
        new OnePublisher().subscribe(new Subscriber<String>() {
            public void onSubscribe(Subscription s) { s.request(1); }
            public void onNext(String v) { System.out.println(v); }
            public void onError(Throwable t) { }
            public void onComplete() { }
        });
    }
}

Beklenen çıktı

merhaba

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Java'nın yerleşik Reactive Streams API'si hangi pakettedir?

  • java.util.stream
  • java.io
  • java.nio
  • java.util.concurrent.Flow Doğru cevap

Açıklama: Flow sınıfı Reactive Streams arayüzlerini içerir.

2 Subscriber importunu tamamla

Soru
import java.util.concurrent.____.Subscriber;
Cevap
import java.util.concurrent.Flow.Subscriber;

Açıklama: Flow sınıfı Subscriber arayüzünü içerir.

3 Flow arayüzlerini eşleştir

Kavram Anlamı
Publisher Veri üretir
Subscriber Veri tüketir
Subscription Akışı denetler
onNext Öğe bildirimi

Uzman bölümündeki tüm dersler