如何正确终止包含循环的图形?

时间:2017-04-11 20:24:59

标签: scala akka akka-stream

我有一个带有循环的SinkShape图表:

source.take(10) ~> merge ~> process ~> split ~> out
                   merge.preferred  <~ split        

在内部,我确保每个Stream元素的循环次数都是有限的。

我使用以下代码实现此图:

val result: Future[Int] = Source.fromGraph(graph).runWith(Sink.fold(...))

现在我尝试获取此Future的值,但永远不会调用onComplete回调。图中的原始Source应该正确终止,因为我添加了.take(10)语句。

我也尝试删除循环,并按预期生成Future

1 个答案:

答案 0 :(得分:2)

Merge阶段(以及MergePreferred)也可以急切地完成。 换句话说,当任何的输入完成时,或所有的输入完成时,您可以告诉您的舞台完成。

在你的情况下,你需要一个急切的完成,因为2个输入中的一个(即标记为首选的输入)将永远不会完成,因为环回。

Merge阶段在布尔标志中公开完成行为,默认为false(有关详细信息,请参阅docs)。尝试将其更改为true。

val merge = b.add(MergePreferred(secondaryPorts = 2, eagerComplete = true))