改变阿卡流的未来

时间:2017-10-26 19:21:11

标签: scala akka akka-stream

我尝试使用Akka Streams同时向服务器发送请求,然后尝试将每个请求与原始上下文相关联(本例中为Int)。这就是我把它放在一起的流程:

val createRequestFlow: Flow[(String, String), (HttpRequest, Int), _] = Flow.fromFunction[(String, String), (HttpRequest, Int)]((mkRequest _).tupled)
val sendRequestFlow: Flow[(HttpRequest, Int), (HttpResponse, Int), _] = Flow[(HttpRequest, Int)].mapAsyncUnordered(32)((sendRequest _).tupled)
val handleResponseFlow: Flow[(HttpResponse, Int), String, _] = Flow[(HttpResponse, Int)].map[String]((getStatusString _).tupled)

val handler =  createRequestFlow via sendRequestFlow via handleResponseFlow

特别是,我试图找到返回Future[(HttpResponse, Int)]的方法。目前,我正在做这个

def sendRequest(request: HttpRequest, ctx: Int): Future[(HttpResponse, Int)] = {
    Http().singleRequest(request).map(r => (r,ctx))
  }

但我理解这需要Executor这一事实表明还有另一种(更好的)方法。

1 个答案:

答案 0 :(得分:1)

我认为没有更好的方法。 Akka使用标准Scala Futures,他们设计需要ExecutionContext来执行几乎任何操作。如果你真的真的不想为这个简单的map使用另一个线程,你可以创建自己的sameThreadExecutionContext,类似于Akka在里面使用的那个(见akka.dispatch.ExecutionContexts.sameThreadExecutionContext)所以{ {1}}将在处理主要Http响应的同一线程上执行,但不要将其用于更复杂的事情(另请参阅GitHub #19043上的讨论)。