RxJava2:2个单独的可观察输出和相同可观察量的合并输出不同

时间:2018-01-10 10:55:55

标签: rx-java2

Snippet1,我可以看到两个订阅者的sysout Snippet2,我看不到第二个观察者的输出 为什么合并对我不起作用?

Snippet1

x = createQ2Flowable().subscribeOn(Schedulers.computation())
        .observeOn(Schedulers.io())
        .filter(predicate -> !predicate.toString().contains("<log realm=\"\""))
        .subscribe(onNext -> System.out.println("Q2->" + onNext));

y = createMetricsFlowable().subscribeOn(Schedulers.computation())
        .observeOn(Schedulers.io())
        .subscribe(onNext -> System.out.println("metrics->" + onNext));  

Snippet2

createQ2Flowable().mergeWith(createMetricsFlowable())
.subscribeOn(Schedulers.computation())
.subscribe(onNext -> System.out.println(onNext));  

[edit]:添加了可流动的创作者

private Flowable<String> createMetricsFlowable() {
    return Flowable.create(source -> {
        Space sp = SpaceFactory.getSpace("rxObservableFeeder");
        while (running()) {
            String line = (String) sp.in("RXTmFeeder");
            source.onNext(line);
        }

    }, BackpressureStrategy.BUFFER);

}

private Flowable<String> createQ2Flowable() {
    return Flowable.create(source -> {
        Space sp = SpaceFactory.getSpace("LoggerSpace");
        while (running()) {
            LogEvent line = (LogEvent) sp.in("rxLoggingKey");
            source.onNext(line.toString());

        }

    }, BackpressureStrategy.BUFFER);

}

1 个答案:

答案 0 :(得分:1)

来自评论:

尝试

createQ2Flowable()
.subscribeOn(Schedulers.computation())      // <-------------------------
.mer‌​geWith(createMetrics‌​Flowable()
    .subscribe‌​On(Schedulers.comput‌​ation())  // <-------------------------
)
  

现在我需要知道它为什么会发生

鉴于详细的实现,您有两个同步Flowable。合并它们时,第一个Flowable订阅并立即开始发送,并且永远不会将控件返回给mergeWith,因此第二个Flowable永远不会订阅。

subscribeOn之后的mergeWith与上面提供的解决方案不同。您必须在后台线程上明确地同时Flowable订阅,所以mergeWith可以订阅第二个Flowable之后,同步循环已从线程移出{{1}用于订阅其来源。