同一个流中有多个接收器

时间:2017-12-19 22:17:11

标签: scala akka akka-stream reactive-streams

我有一个像这样的流和两个接收器,但一次只使用一个:

Source.fromElements(1, 2, 3)
.via(flow)
.runWith(sink1)

Source.fromElements(1, 2, 3)
.via(flow)
.runWith(sink2)

我们可以配置哪个接收器,但是如果我并行使用两个接收器怎么办呢。 我怎么能这样做?

我想到了Sink.combine,但它还需要一个合并策略,我不想以任何方式结合这些接收器的结果。我并不真正关心它们,所以我只希望通过HTTP将相同的数据发送到某个端点,同时将它们发送到数据库。 Sink组合与广播非常相似,但是从头开始实现广播会降低我的代码的可读性,现在我只有简单的源,流和接收器,没有低级图形阶段。

你知道如何做到这一点的正确方法(背压和其他我只使用一个接收器的东西)?

2 个答案:

答案 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()