可连接观察者:观察所有订阅者的终止

时间:2016-10-19 09:17:46

标签: java rx-java reactive-programming

我有一个可连接的观察者,有多个订阅者。

每个订阅者计算一些业务逻辑。例如,一个订阅者存储在每个onNext调用中产生数据库,其他订阅者在内存中累积它的结果,并且当onCompleted被调用时将它们写入文件。我想知道他们什么时候都完成了他们的工作,所以我可以继续做其他事情(与其他可连接的观察者聚合,从数据库中读出输出的数据等)。

这就是我观察终止的方式。它只能工作,因为订阅者在与观察者相同的线程中执行。

public Observable<Boolean> observeTermination() {
    return Observable.defer(() -> {
        try {
            start();
            return Observable.just(true);
        } catch (RuntimeException e) {
            return Observable.just(false);
        }
    });
}

void start() {
    Observable<List<Foo>> fooBatchReaderObservable = fooBatchReader.createObservable(BATCH_SIZE);

    ConnectableObservable<List<Foo>> connectableObservable = fooBatchReaderObservable.publish();
    subscribers.forEach(s -> connectableObservable.subscribe(s));

    connectableObservable.connect();
}

因此,当observeTermination被调用时,我不想在start方法中执行逻辑,但只有当有人订阅它时。 有没有办法让观察更好?

嗯,这一切都很糟糕。问题是我需要在某个地方的observable上调用connect并返回boolean结果作为终止的终止。

1 个答案:

答案 0 :(得分:0)

不是一个正确的答案,但它需要空间来正确解释。如果你可以处理Observable而不是订阅者会更容易;这样可以更灵活地编写它们;

鉴于您有components

Collection<Function<Observable<T>, Observable<?>>> components:
Observable<T> tObs = ... .publish().autoConnect(components.size());
Observable
.from(components)
.flatMap(component -> component.apply(tObs))
.ignoreElements()
.doOnTerminate() // or .defaultIfEmpty(...), or .switchIfEmpty(...)
.subscribe(...);

事实上,我说你甚至不应该在这里订阅,只需创建observable并将其返回,让它可用​​于代码其他部分的合成。