CodeBlanks Logo Icon CodeBlanks

Publisher ve Subscriber

Publisher ve Subscriber rollerini öğrenirsin.

Publisher ve Subscriber etkileşimi

Akış, Publisher.subscribe çağrısıyla başlar. Publisher önce Subscriber.onSubscribe ile bir Subscription verir. Subscriber bu Subscription üzerinden request çağırınca Publisher onNext ile öğeler gönderir.

Akışın sonu iki yolla gelir: onComplete başarıyla bittiğini, onError bir hata olduğunu bildirir. Her ikisinden sonra başka onNext gelmez. Bu sözleşme, akışın öngörülebilir olmasını sağlar; Subscriber her zaman aynı yaşam döngüsünü izler.

İstek ve iletim

Subscriber, request(n) ile n öğe ister. Publisher bu kadar öğeyi onNext ile gönderir. Daha fazla isteyene kadar ek öğe göndermek sözleşmeye aykırıdır; bu, geri basıncın temelidir.

Örnek: request(1) bir öğe ister, onNext geldikten sonra tekrar request(1) çağrılabilir. Bu, her öğeyi tek tek işleyen bir Subscriber için uygundur. request(Long.MAX_VALUE) ise sınırsız talep anlamına gelir; bu, geri basıncın devre dışı kalmasına yol açar.

Uygulama İki öğeyi topla

Bir SumPublisher sınıfı tanımla: Publisher<Integer> arayüzünü uygulasın. subscribe içindeki request yöntemi s.onNext(10), s.onNext(20) ve s.onComplete() çağrısı yapsın. main içinde anonim Subscriber; onSubscribe request(Long.MAX_VALUE) yapsın, onNext sum += v yapsın, onComplete System.out.println(sum) ile toplamı yazdırsın.

Başlangıç kodu

Main.java
// SumPublisher sınıfını tanımla
// onNext ile topla
// onComplete içinde yazdır

Örnek çözüm

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

class SumPublisher implements Publisher<Integer> {
    public void subscribe(Subscriber<? super Integer> s) {
        s.onSubscribe(new Subscription() {
            public void request(long n) { s.onNext(10); s.onNext(20); s.onComplete(); }
            public void cancel() { }
        });
    }
}

public class SumDemo {
    public static void main(String[] args) {
        new SumPublisher().subscribe(new Subscriber<Integer>() {
            int sum;
            public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); }
            public void onNext(Integer v) { sum += v; }
            public void onError(Throwable t) { }
            public void onComplete() { System.out.println(sum); }
        });
    }
}

Beklenen çıktı

30

Soru ve cevaplar

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

1 Yaşam döngüsünü eşleştir

Kavram Anlamı
subscribe Aboneliği başlatır
onSubscribe Subscription alır
onNext Öğeyi alır
onComplete Akış bitti

2 Publisher'ın subscribe yöntemi ne alır?

  • Bir Subscriber Doğru cevap
  • Bir String
  • Bir int
  • Bir Subscription

Açıklama: subscribe bir Subscriber alır ve akışı başlatır.

3 onNext yöntemini tanımla

Soru
public void ____(String v) { System.out.println(v); }
Cevap
public void onNext(String v) { System.out.println(v); }

Açıklama: onNext bir öğeyi Subscriber'a bildirir.

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