RxJava2,明确地完成了一个冷源(Flowable)

时间:2017-12-12 12:16:20

标签: java rx-java2

先搜索,找不到好的答案,所以我们去了:)。

尝试将RxJava2应用于我们在工作中使用的现有管道 - 热源和冷源。虽然停止一个热门(用Flowable.create包裹)很简单,但另一个案例看起来比较棘手。 简而言之,我希望能够使源完成排出管道中已有的项目,然后才能处理掉。 这就是我提出的(takeUntil()和一个结束序列的特殊项目),但关于有更好的方法的问题仍然存在

(Flowables.repeatCallable是https://github.com/akarnokd/RxJava2Extensions的扩展,比我的情况更适合我的情况) buffer / map / reduce就是为了创建某些处理的相似之处:)

    final AtomicInteger counter = new AtomicInteger();
    AtomicBoolean stop = new AtomicBoolean(false);
    Disposable d = Flowables.repeatCallable(() -> {
                return stop.get() ? -1 : counter.getAndIncrement();
            }
    )
            .doOnCancel(() -> {
                debug("cancelled");
            })
            .doOnRequest(l ->
                    debug(Long.toString(l) + " values requested")
            )
            .takeUntil(val -> val < 0)
            .filter(val -> val >= 0)
            .buffer(2000, TimeUnit.MILLISECONDS, scheduler, 15, ArrayListSupplier.asCallable(), true)
            .map(list -> {
                debug("received " + list.size() + " items: " + list);
                return list.size();
            })
            .reduce(0, (sum, item) -> sum + item)
            .subscribeOn(scheduler)
            .subscribe(i -> debug("Items received: " + i));

然后,在某些时候:

    stop.set(true);
    while (!d.isDisposed()) {
        // wait
    }

这在收到停止信号后完成,最终的onSuccess处理程序执行。 奇怪的是,onCancel处理程序被调用两次: 首先来自

onNext:69, FlowableTakeUntilPredicate$InnerSubscriber (io.reactivex.internal.operators.flowable)

然后从

cancel:100, FlowableTakeUntilPredicate$InnerSubscriber (io.reactivex.internal.operators.flowable)
dispose:543, FlowableBufferTimed$BufferExactBoundedSubscriber (io.reactivex.internal.operators.flowable) 

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试将流量控制用于其目的并非真正意义上。因此,buffer()会使你的所有流量控制机制失败,你就会陷入困境。

同样,只要谓词成功,takeUntil()就会取消订阅您的o​​bservable。没有&#34;排水&#34;此时,所有可接受的值已经传递到下游。

尝试使用stop作为可观察混音模式的控件,再次,不会做你认为它做的事情。

引入ReplayProcessor或类似的中介将允许冷源继续发送数据,即使没有订阅处于活动状态。

最终,您必须将您的疑虑分开。有几个关于将冷观测值转换为热观测值的好教程。