我创建了一个小的示例图,其中输入元素被传递到输出并且还被发送回反馈循环,该循环丢弃所有内容(使用过滤器)。
我希望获得与标识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()
}
}
答案 0 :(得分:0)
已回答here。周期永远不会完成,因为Merge
和Broadcast
正在等待彼此完成。
您可以将其更改为val input = b.add(Merge[Int](2, eagerComplete = true))
以防止此情况发生。
或者,您可以尝试val dropEverything = b.add(Flow[Int].take(1).filter(_ => false))
其中n
是从输入到处理的元素数量,在这种情况下为1
。