我在Akka流中使用Source.combine。我注意到所有源都出现在图生命周期开始的同一时间,并在按照source.combine列表的顺序暂停和恢复之前缓冲一些输入。
val singletonSources = builder.add(
Source.combine(
Source.single(("TABLE HEADER")),
actorSource1.map(_ ... toString), //a source using ask ? to an actor
Source.single("ETC"),
HttpSource1.map(x=> bytes... to string),
Source.single("ETC"),
actorSource2.map(_ ... toString), //a source using ask ? to an actor
Source.single("ETC"),
HttpSource2.map(x=> bytes... to string),
)(Concat(_)))
我有来自HttpRequests的来源以及有问题的演员吗?但是这两种类型在运行图形时似乎“缓冲”了一些输入。我确实看到他们每个人都在等待以正确的顺序恢复但是对于http请求,除非我在长时间运行请求之前将它们放在源列表的开头我得到了Akka tcp超时异常,因为连接似乎等待传入数据。
答案 0 :(得分:0)
使用foldLeft连接源:
val sourceList = List( Source single "TABLE HEADER",
actorSource1.map ...,
...
)
val oneSourceToRuleThemAll : Source[String, _] =
(Source.empty[String] /: sourceList)(_ ++ _)
答案 1 :(得分:0)
将combine
策略更改为Merge
。
根据Doc
<强>的concat 强>
发出:当前流有一个元素可用时;如果是当前的 输入完成,它会尝试下一个
<强>合并强>
发出:当其中一个输入有可用元素时
换句话说,使用concat
策略,如果第一个源永远不会完成,其余的源将永远不会有机会被处理。
所以,正确的方法是:
val singletonSources = builder.add(
Source.combine
Source.single(("TABLE HEADER")),
actorSource1.map(_ ... toString),
Source.single("ETC"),
HttpSource1.map(x=> bytes... to string),
Source.single("ETC"),
actorSource2.map(_ ... toString), //a source using ask ? to an actor
Source.single("ETC"),
HttpSource2.map(x=> bytes... to string),
)(Merge(_)))