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