Java
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.
Örnek çözümü göster
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); }
});
}
}
Kendini test et
-
Yaşam döngüsünü eşleştir
- subscribe
- Aboneliği başlatır
- onSubscribe
- Subscription alır
- onNext
- Öğeyi alır
- onComplete
- Akış bitti
-
Publisher'ın subscribe yöntemi ne alır?
- Bir Subscriber
- Bir String
- Bir int
- Bir Subscription
Cevabı göster
Bir Subscriber — subscribe bir Subscriber alır ve akışı başlatır.
-
onNext yöntemini tanımla
public void ____(String v) { System.out.println(v); }
Cevabı göster
public void onNext(String v) { System.out.println(v); }
Sıradaki ders: SubmissionPublisher