Publisher ve Subscriber
- Java kursu
- Uzman
- Ders 20/46
- 5 dk
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
// SumPublisher sınıfını tanımla
// onNext ile topla
// onComplete içinde yazdırÖrnek çözüm
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
public void ____(String v) { System.out.println(v); }
public void onNext(String v) { System.out.println(v); }
Açıklama: onNext bir öğeyi Subscriber'a bildirir.