具有循环的akka​​-stream图表具有drop-everything反馈分支在实现时不会完成

时间:2016-02-04 18:03:03

标签: scala akka akka-stream

我创建了一个小的示例图,其中输入元素被传递到输出并且还被发送回反馈循环,该循环丢弃所有内容(使用过滤器)。

我希望获得与标识Flow [T]相同的行为,因为反馈分支会丢弃所有内容。

相反,输入元素按预期发出但实现从未完成。

我做错了吗?这应该发生吗?当输入流完成时,广播的反馈输出是否应该完成?

我想这个问题类似于here所描述的鸡蛋和鸡蛋情景?

我正在使用akka-stream-experimental 2.0.3

干杯

object Test extends App {
  implicit val system = ActorSystem()
  implicit val mat = ActorMaterializer()

  val flow = Flow.fromGraph(GraphDSL.create() { implicit b =>
    import GraphDSL.Implicits._

    val dropEverything = b.add(Flow[Int].filter(_ => false))
    val input = b.add(Merge[Int](2))
    val bcast = b.add(Broadcast[Int](2))

    input                         ~> bcast
    input.in(1) <~ dropEverything <~ bcast.out(1)

    FlowShape(input.in(0), bcast.out(0))
  })

  val result = Source.single(42).via(flow).runWith(Sink.foreach(println))

  try {
    // prints 42 but the stream doesn't terminate and the await timeouts
    println(Await.result(result, 5.seconds))
  } finally {
    system.terminate()
  }
}

1 个答案:

答案 0 :(得分:0)

已回答here。周期永远不会完成,因为MergeBroadcast正在等待彼此完成。

您可以将其更改为val input = b.add(Merge[Int](2, eagerComplete = true))以防止此情况发生。

或者,您可以尝试val dropEverything = b.add(Flow[Int].take(1).filter(_ => false))其中n是从输入到处理的元素数量,在这种情况下为1