如何实现单次使用有序的ReplaySubject?

时间:2016-05-11 16:37:12

标签: java rx-java observable rx-scala

如何让单个订阅者ReplaySubject

  1. 缓存与onNext()一起收到的所有事件,直到有人订阅它为止,
  2. 一旦有人订阅它,所有缓冲的事件都会转发给订阅者,从ReplaySubject缓冲区中删除它们(出于性能原因),后续事件只会转发给订阅者(不再需要缓冲),
  3. 如果有多个观察者订阅它,则抛出异常,
  4. 根据每个事件生成的时间对主题提供的所有缓冲事件进行排序,并在订阅期间按顺序转发给订阅者?
  5. 另外,这有意义吗?我认为这个主题有很好的用例,例如它可以从例如文件系统转发事件......

1 个答案:

答案 0 :(得分:3)

UnicastSubject用于此目的,虽然它不是官方API的一部分;这意味着它可以在没有警告的情况下更改或删除。

修改

让我指出您要求的功能:

1)缓冲所有事件:

If there is no child or it hasn't caught up: store the element in the queue

2)订阅时,缓冲区被消耗并重放到订阅者

The drain loop will poll from the queue and consume itif the Subscriber caught up, will emit to it directly

3)如果多个观察者订阅它,则抛出异常

A subsequent subscriber will get an exception

4)给予主题的所有缓冲事件都是根据每个事件生成的时间排序的

Uses a single-producer single-consumer queue that guarantees FIFO order