假设我有以下任务链要定期执行。
Observable.interval(0, 10, TimeUnit.SECONDS)
.flatMapIterable(l -> provider.getAssets())
.map(renderer::render)
.map(converter::convert)
.subscribe(provider::publish)
尽管每个任务可能要花10秒钟以上的时间才能完成。我想每10秒调用一次getAssets()
,但不想赶上自处理开始以来发生的排放。我如何省略它们?谢谢。
答案 0 :(得分:0)
我认为您可以通过添加“进行中标记”来解决此问题。在您的情况下,它看起来像这样:
AtomicBoolean inProgress = new AtomicBoolean(false);
Observable.interval(0, 10, TimeUnit.SECONDS)
.filter(emission -> !inProgress.get())
.flatMapIterable(l -> provider.getAssets())
.map(renderer -> {
// set to true when processing started
inProgress.set(true);
return renderer.render();
})
.map(converter::convert)
.subscribe(provider -> {
// set to false when processing finished
provider.publish();
inProgress.set(false);
});
答案 1 :(得分:0)
事实证明,我在backpressure operators之后,尤其是在onBackpressureDrop
之后,省略了最新值。
Flowable.interval(1, TimeUnit.MINUTES)
.onBackpressureDrop()
.observeOn(Schedulers.io())
.doOnNext(e -> networkCall.doStuff())
.subscribe(v -> { }, Throwable::printStackTrace);