[英]RXJava2 reader Observable with concurrent subscribers
我正在嘗試從BufferedReader
實現RXJava2 Observable<String>
。 到現在為止還挺好:
public class Launcher {
public static void main(String[] args) throws Exception {
Process process = Runtime.getRuntime().exec("ls /tmp");
BufferedReader reader = new BufferedReader (new InputStreamReader(process.getInputStream()));
Observable source = Observable.create(emitter -> {
String line = "";
while (line != null) {
line = reader.readLine();
if (line == null)
break;
System.out.println("Engine " + Thread.currentThread().getName() + " - " + line); //process line
emitter.onNext(line);
}
emitter.onComplete();
}).subscribeOn(Schedulers.newThread());
source.subscribe(line -> System.out.println("UI 1 " + Thread.currentThread().getName() + " - " + line));
source.subscribe(line -> System.out.println("UI 2 " + Thread.currentThread().getName() + " - " + line));
TimeUnit.SECONDS.sleep(10);
}
}
onSubscribe
可以並行方式通知訂戶。 如果我沒記錯的話,這意味着create()
中的lambda將為每個使用者並行執行。
結果,如果我有兩個訂閱者,那么每個訂閱者都會獲得閱讀器行數的一半。 線程1調用readLine()
來獲得線程2的行,而不會得到下一行。
盡管如此,這一切還是有道理的,因為我不知道如何:
我調查了Subject
,試圖將Observable
鏈接起來,但仍無法弄清楚。
編輯:我將示例更新為完整的可運行類。 據我了解,問題是可觀察到的相對熱。 好像文檔說Observable.create(...)
應該創建一個冷的,而我的代碼顯然表現得很熱。
后續問題:如果我添加使其成為Observable<String>
的類型參數,則onSubscribe
調用將破壞代碼,並且它將無法編譯,因為這將返回Observable<Object>
。 為什么? 在中間參數上調用onSubscribe
很奇怪:
Observable<String> source = Observable.create(emitter -> {...});
Observable<String> source2 = source.subscribeOn(Schedulers.newThread())
使用publish
:
ConnectableObservable<String> o = Observable.create(emitter -> {
try (BufferedReader reader = ...) {
while (!emitter.isDisposed()) {
String line = reader.readLine();
if (line == null || line.equals("end")) {
emitter.onComplete();
return;
}
emitter.onNext(line);
}
}
}).subscribeOn(Schedulers.io())
.publish();
o.subscribe(/* consumer 1 */);
o.subscribe(/* consumer 2 */);
o.connect();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.