何时使用rxjava2扩展MulticastProcessor

时间:2018-03-09 15:58:44

标签: rx-java rx-java2

来自rxjava扩展的MulticastProcessor的目的是什么?例如,有一个源和两个接收器,正常模式是:

Flowable<T> f = ...
ConnectableFlowable<T> published = f.publish();
published.map(mapper1).subscribe(s1);
published.map(mapper2).subscribe(s2);
published.connect();

据我了解,MulticastProcessor的等效代码为:

Flowable<T> f = ...
MulticastProcessor<T> mp = MulticastProcessor.create(true);
mp.map(mapper1).subscribe(s1);
mp.map(mapper2).subscribe(s1);
f.subscribe(mp);

假设这两段代码是等价的,那么何时使用其中一段代码。 MulticastProcessor的javadoc似乎有点过于简洁。

1 个答案:

答案 0 :(得分:1)

您是否阅读了相关的guide entry

  

publish(Function)类似,并且如果所有项都准备好接收项,则向订阅者多播项。   此外,它支持最后一个订户取消将触发上游取消的模式。   如果您需要在不预订MulticastProcessor到另一个Publisher的情况下运行start()startUnbounded()。   使用offer()尝试提供/发出项目,但如果内部缓冲区已满,则不会失败。

MulticastProcessor<Integer> mp = Flowable.range(1, 10)
    .subscribeWith(MulticastProcessor.create());

mp.test().assertResult(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// --------------------

MulticastProcessor<Integer> mp2 = MulticastProcessor.create(4);
mp2.start();

assertTrue(mp2.offer(1));
assertTrue(mp2.offer(2));
assertTrue(mp2.offer(3));
assertTrue(mp2.offer(4));

assertFalse(mp2.offer(5));

mp2.onComplete();

mp2.test().assertResult(1, 2, 3, 4);

标准PublishProcessor不等同于publish()运算符,因为前者不协调下游请求。此外,Reactive Streams和TCK的某些实现期望处理器在所有下游Subscriber取消订阅时取消其上游,类似于refCount与RxJava特定ConnectableFlowable的工作方式。 MulticastProcessor也可以支持此行为。