我注意到我的rxjava工作流程中存在一种奇怪的行为。
问题是当我将长数据流与短数据流组合时(取决于getEntries()返回的内容)。
长流需要几分钟,短流需要几秒钟。
通常情况下,即使短期订阅在长期订阅之后开始,它也会在之前获得onComplete。但是,在4次或5次尝试中的大约1次中,短流的onComplete是在较长的一次之后接收的。
我怀疑这是由于计算调度程序选择在长期订阅保持忙碌的rx线程上调度onComplete。令我难以置信的是,其他7个rx计算线程(8个核心机器)线程什么也没做。
我尝试在每个订阅上使用不同的线程,并且每次都按预期工作
Executor executor = Executors.newSingleThreadExecutor()
.observeOn(Schedulers.from(executor))
.subscribeOn(Schedulers.from(executor))
以下代码
服务
public Flowable<E> entryFlow()
{
return Flowable
.fromIterable(getEntries())
.filter(Objects::nonNull)
.concatMap(this::transformEntry);
}
Flowable<E> transformEntry(E entry)
{
return Flowable.just(entry);
}
在某些情况下,transformEntry可能会被覆盖,但在我的试运行中,它始终是一个元素,所以我不确定concatMap是否在此中扮演角色。
消费
service
.entryFlow()
.doOnCancel(this::onCancel)
.observeOn(Schedulers.computation())
.subscribeOn(Schedulers.computation())
.subscribe(
this::onNext,
this::onError,
this::onComplete);
我看了一下这个问题RxJava - Schedulers vs ExecutorService?和引用的博客文章和评论,但它仍然不清楚为什么会发生这种情况以及频率(4次中约1次)。
会对此有所了解。
谢谢