RxJava 2-在处理时省略间隔发射

时间:2018-09-18 09:08:23

标签: java rx-java rx-java2

假设我有以下任务链要定期执行。

Observable.interval(0, 10, TimeUnit.SECONDS)
    .flatMapIterable(l -> provider.getAssets())
    .map(renderer::render)
    .map(converter::convert)
    .subscribe(provider::publish)

尽管每个任务可能要花10秒钟以上的时间才能完成。我想每10秒调用一次getAssets(),但不想赶上自处理开始以来发生的排放。我如何省略它们?谢谢。

2 个答案:

答案 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);