我有一个像这样的流和两个接收器,但一次只使用一个:
Source.fromElements(1, 2, 3)
.via(flow)
.runWith(sink1)
或
Source.fromElements(1, 2, 3)
.via(flow)
.runWith(sink2)
我们可以配置哪个接收器,但是如果我并行使用两个接收器怎么办呢。 我怎么能这样做?
我想到了Sink.combine,但它还需要一个合并策略,我不想以任何方式结合这些接收器的结果。我并不真正关心它们,所以我只希望通过HTTP将相同的数据发送到某个端点,同时将它们发送到数据库。 Sink组合与广播非常相似,但是从头开始实现广播会降低我的代码的可读性,现在我只有简单的源,流和接收器,没有低级图形阶段。
你知道如何做到这一点的正确方法(背压和其他我只使用一个接收器的东西)?
答案 0 :(得分:10)
您可以使用alsoTo
(请参阅API docs):
Flow[Int].alsoTo(Sink.foreach(println(_))).to(Sink.ignore)
答案 1 :(得分:3)
以最简单的形式使用GraphDSL
进行广播不应该降低可读性 - 实际上,人们甚至可能会认为~>
子句在某种程度上有助于可视化流结构:
val graph = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder =>
import GraphDSL.Implicits._
val bcast = builder.add(Broadcast[Int](2))
Source.fromElements(1, 2, 3) ~> flow ~> bcast.in
bcast.out(0) ~> sink1
bcast.out(1) ~> sink2
ClosedShape
})
graph.run()