在Akka Streams图中将流的输出馈送到广播

时间:2017-08-30 17:18:46

标签: scala akka-stream

我正在尝试编写Akka Stream图。我写的代码是

val graph = RunnableGraph.fromGraph(GraphDSL.create(sink1, sink2)((_, _)) { implicit builder =>
   (sink1, sink2) =>
      import GraphDSL.Implicits._
      val bcast = builder.add(Broadcast[Row](2))
      val flow = source ~> flow1 ~> flow2
      flow.out ~> bcast.in
      bcast.out(0) ~> sink1
      bcast.out(1) ~> flow3 ~> flow4 ~> sink2
      ClosedShape
})

val (f1, f2) = graph.run()
val consolidated = Future.sequence(List(f1, f2))
Await.result(consolidated, Duration.Inf)

此代码无法编译,因为我无法将流出连接到bcast中。

我可以将源外连接到bcast的in,但我不能这样做因为某些部分在两个分支之间是通用的。所以我必须在flow2

之后才在图表中创建分支

另外......我不确定我是否正确地编写了图表,因为它返回了两个Done期货,我需要使用Sequence手动将它们组合成一个单独的未来。

1 个答案:

答案 0 :(得分:1)

您无法通过两个步骤连接图表,因为~>组合器不会给您回流。它实际上是一种有状态的,声明性的操作。

这里更好的方法是一次性连接图表,例如

  source ~> flow1 ~> flow2 ~> bcast
                              bcast          ~>          sink1
                              bcast ~> flow3 ~> flow4 ~> sink2

或者,您可以通过向构建器添加一个阶段(并检索其形状)来拆分声明,例如

  val flow2s = builder.add(flow2)

  source ~> flow1 ~> flow2s.in
  flow2s.out ~> bcast
                bcast          ~>          sink1
                bcast ~> flow3 ~> flow4 ~> sink2

关于具体化的Future,您需要选择有意义的图表作为整体图形的具体化值。如果您只需要2个Sink具体化Future中的一个,则只需要将其传递给GraphDSL.create方法。 如果您对这两个Future感兴趣,那么sequencezip他们在一起就非常有意义。