Rx java 从队列项目中观察到的停止java rx间隔

Rx java 从队列项目中观察到的停止java rx间隔,rx-java,Rx Java,我有一个可观察的.interval,每10秒发射一个项目。在我的订阅服务器中,我有一个同步操作,有时会持续10秒以上。结果是,我的observable每10秒发出一次,因此当同步操作结束时,订户会连续多次被调用 以下是我所拥有的: Observable.interval(0, 10, TimeUnit.SECONDS) .subscribeOn(Schedulers.io()) .subscribe(new Action1<Long>() { @Ove

我有一个
可观察的.interval
,每10秒发射一个项目。在我的订阅服务器中,我有一个同步操作,有时会持续10秒以上。结果是,我的observable每10秒发出一次,因此当同步操作结束时,订户会连续多次被调用

以下是我所拥有的:

Observable.interval(0, 10, TimeUnit.SECONDS)
    .subscribeOn(Schedulers.io())
    .subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            aSynchronousOperation(); // Last more than 10 seconds
         }
     });
可观测间隔(0,10,时间单位秒)
.subscribeOn(Schedulers.io())
.订阅(新操作1(){
@凌驾
公开作废通知(长期有效){
aSynchronousOperation();//持续10秒以上
}
});
我想做的是在完成同步操作后“刷新”可观察对象


如何做到这一点?

问题在于,
observeOn
尊重背压,将缓冲间隔内的排放,并在订阅者完成其工作时排放。
实际上,理论上你可以得到
missingBackpressureeException
,因为默认缓冲区可能会溢出(理论上是因为你的10秒间隔很长)。
在这里,您需要的是在您仍在处理时删除项目,这可以通过使用简单标志和
过滤器来实现,该过滤器将防止在您的工作进行中出现任何排放

请注意,在您提到的情况下,当工作需要10秒以上时,您将不会在工作完成后收到
间隔的通知,而会在10秒后收到通知。您可以通过实施不同的策略来轻松地改变它,即在工作进行过程中,在国旗升起后让过滤器通过单个值,然后阻止额外的排放

 AtomicBoolean workInProgress = new AtomicBoolean(false);
    Observable.interval(10, TimeUnit.SECONDS)
            .filter(aLong -> !workInProgress.get())
            .observeOn(Schedulers.io())
            .subscribe(aLong -> {
                workInProgress.set(true);
                aSynchronousOperation();
                workInProgress.set(false);
            });

这种情况下的规范运算符是
onBackPressureDrop

Observable
.interval(0, 10, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.onBackPressureDrop()
.subscribe(new Action1<Long>() {
    @Override
    public void call(Long aLong) {
        aSynchronousOperation(); // Last more than 10 seconds
     }
 });
可观察
.间隔(0,10,时间单位秒)
.subscribeOn(Schedulers.io())
.onBackPressureDrop()
.订阅(新操作1(){
@凌驾
公开作废通知(长期有效){
aSynchronousOperation();//持续10秒以上
}
});

从我的理解(和测试)来看,这在这里没有帮助,因为我们有默认的背压缓冲量,因此,只有在缓冲区被填满后,压降才会起作用,这意味着在这种情况下,我们不会得到压降,我们将获得连续多个排放量。似乎不能动态地重写RxJava的默认缓冲区。我遗漏了什么吗?是的,这就是为什么你希望操作员尽可能靠近长时间运行的操作。如何使其更接近有帮助?它不起作用。从我收集到的信息来看,问题在于时间间隔是一个冷的可观测值,这意味着它懒散地释放值。所以一开始就没有背压。我试过你说的,但不起作用。当工作完成时,可观察对象立即发出所有值。还有,为什么你用原子布尔而不是简单的布尔?这里的关键是observeOn,你用过它吗?我使用原子布尔,因为订阅服务器和订阅服务器在不同的线程上运行,筛选器将在计算时运行,而订阅服务器在io时运行。我切换了顺序,并将
observeOn
放在
filter
之前,使筛选器也在io线程上运行。我的错!谢谢你的回答。它似乎起作用了。