Akka流组合来源,来源似乎同时开始

时间:2017-05-10 21:14:10

标签: scala akka-http akka-stream

我在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超时异常,因为连接似乎等待传入数据。

2 个答案:

答案 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(_)))