如何在rxjava中实现平衡扇出?

时间:2016-11-19 07:02:12

标签: rx-java

基本上,我们有一个生产者,它一次产生一个随机数,几个消费者睡1秒然后打印一个数字。

每个消费者都是独家消费者,每个消费者只能有一个接收者   此行为类似于Java中的JMS队列或BlockingQueue。

在akka流中,我可以找到

balance[T] – (1 input, N outputs) given an input element emits to one of its output ports.

但我找不到rxjava中的任何内置组件做同样的工作   Observable始终向所有观察者广播消息,如pub-sub样式。如果我需要queue样式,我该怎么办。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我认为你所拥有的心理模型与Rx的构建并不完全匹配 - 想想许多小型操作的流,而不是大型组件之间的消息。

我建议a)一个上限线程池b)一个绕它的RX调度程序然后c:

databaseSource
.fetchItems()
.flatMap(item -> 
   Obsevable.just(item)
   .observeOn(cappedThreadScheduler)
   .map(item -> longRunningOperation(item))
)

OTOH,你也可以这样做:

databaseSource
.fetchItems()
.flatMap(item -> 
   Obsevable.just(item)
   .observeOn(schedulers.io())
   .map(item -> longRunningOperation(item))
   , 16
)

最多可以并行运行16个操作。