Collections 确保项目已在RxJava中传递到onNext侦听器

Collections 确保项目已在RxJava中传递到onNext侦听器,collections,synchronization,rx-java,Collections,Synchronization,Rx Java,我有一个特殊的需要,以确保项目交付给订户。如果onNext将返回boolean,指示项目是否已交付,那就太好了,但不幸的是,它将返回void 我收集了一些由BlockingDeque支持的项目。新项目被添加到队列中,并由订阅者合并。订户可随时取消订阅,项目可能会丢失。以下是我当前的实现: return Observable.create((Subscriber<? super Item> subscriber) -> { while (true) { t

我有一个特殊的需要,以确保项目交付给订户。如果
onNext
将返回
boolean
,指示项目是否已交付,那就太好了,但不幸的是,它将返回
void

我收集了一些由
BlockingDeque
支持的项目。新项目被添加到队列中,并由订阅者合并。订户可随时取消订阅,项目可能会丢失。以下是我当前的实现:

return Observable.create((Subscriber<? super Item> subscriber) -> {
    while (true) {
        try {
            Item item = items.poll(poolTimeout, poolUnit);
            if (!subscriber.isUnsubscribed()) {
                subscriber.onNext(item);
            } else {
                items.addFirst(item);
                break;
            }
        } catch (InterruptedException e) {
            if (subscriber.isUnsubscribed()) {
                break;
            }
        }
    }
    subscriber.onCompleted();
}).subscribeOn(Schedulers.io())
   ...

我正在寻找一种解决方案,使我能够以先进先出(FIFO)的顺序交付物品,并100%确定不会丢失任何物品。有没有办法在RxJava中实现这一点?

如果我正确理解了您的问题,您需要一个有保证的端到端交付,并且可以选择在由于取消订阅而被拒绝的项目上进行备份

不幸的是,RxJava并不是以这种方式构建的,因为许多操作符和类在取消订阅后只是删除onNext值。我也看到了一些问题:

  • 哪个订阅者可以判断该项目是否已成功消费
  • boolean-onNext(tt)
    不能很好地跨越异步边界。我们也有类似的退订问题
  • 返回布尔值意味着如果下游使用observeOn,则需要阻塞

我只能想象有一组并发项目的设置。源将一项放入该集中并调用onNext。最终订户在成功处理该项目时,会从集合中删除该项目。如果该最终订户取消订阅,则所有剩余项目都将被视为未送达。但是请注意,取消订阅是最大的努力,因此集合可能会指示取消订阅后短时间内将成功传递的未传递事件,除非您同步onNext和取消订阅操作

如果您有“取消订阅”功能,您想发出一个项目事件?@dwursteisen No。我想在有人订阅时发出项目,并确保项目已被处理。当前在处理subscriber.onNext(item)时,订阅者取消订阅时可能会丢失项目。这就是为什么只有999件物品被交付,1件物品丢失的原因。您可以在调用onNext后向该物品添加一个已消费标志,看看它是否正确。@akarnokd我怀疑这是正确的解决方案。发布和订阅在不同的线程上执行,您希望在一个线程上尽快发布所有项目,并在另一个线程上分别处理它们。检查项目是否已在发布线程上被使用对我来说没有意义,我是否错过了解决方案中的重要内容?是否发送项目进行异步处理,并希望同步等待?我将检查代码并让您知道它是否符合我的需要
java.lang.AssertionError:
Expected size:<1000> but was:<999> in: