簡體   English   中英

RXJava2閱讀器可用於並發訂閱者

[英]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的行,而不會得到下一行。

盡管如此,這一切還是有道理的,因為我不知道如何:

  1. 在一個線程中讀取行
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM