我有一个带有循环的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
答案 0 :(得分:2)
Merge
阶段(以及MergePreferred
)也可以急切地完成。
换句话说,当任何的输入完成时,或所有的输入完成时,您可以告诉您的舞台完成。
在你的情况下,你需要一个急切的完成,因为2个输入中的一个(即标记为首选的输入)将永远不会完成,因为环回。
Merge
阶段在布尔标志中公开完成行为,默认为false(有关详细信息,请参阅docs)。尝试将其更改为true。
val merge = b.add(MergePreferred(secondaryPorts = 2, eagerComplete = true))