Scala和Akka HTTP:请求内的请求和线程问题

问题描述 投票:2回答:1

我对学习Scala,Akka Streams和Akka HTTP并不陌生,因此如果问题太简单,请事先道歉。

我想在HTTP请求中执行一个HTTP请求,就像下面的代码一样:

  implicit val system = ActorSystem("ActorSystem")
  implicit val materializer = ActorMaterializer
  import system.dispatcher

  val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].map {
    case HttpRequest(HttpMethods.GET, Uri.Path("/api"), _, _, _) =>
      val responseFuture = Http().singleRequest(HttpRequest(uri = "http://www.google.com"))
      responseFuture.onComplete {
        case Success(response) =>
          response.discardEntityBytes()
          println(s"The request was successful")
        case Failure(ex) =>
          println(s"The request failed with: $ex")
      }
      //Await.result(responseFuture, 10 seconds)
      println("Reached HttpResponse")
      HttpResponse(
        StatusCodes.OK, // HTTP 200
      )
  }

  Http().bindAndHandle(requestHandler, "localhost", 8080)  

但是在上述情况下,结果看起来像这样,这意味着在完成请求之前首先到达Reached HttpResponse

Reached HttpResponse
The request was successful

我尝试使用Await.result(responseFuture, 10 seconds)(当前已注释掉),但没有区别。

我在这里想念什么?任何帮助将不胜感激!

非常感谢!

scala httprequest httpresponse akka-stream akka-http
1个回答
0
投票

挑战是responseFutureFuture的一种。因此,您需要一个处理它的函数。该函数接受HttpRequest并返回Future of something。

HttpRequest => Future[T]

瞧,mapAsync正是您所需要的:

val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].mapAsync(2) {
  case HttpRequest(HttpMethods.GET, Uri.Path("/api"), _, _, _) =>
    Http().singleRequest(HttpRequest(uri = "http://www.google.com")).map (resp => {
      resp.discardEntityBytes()
      println(s"The request was successful")
      resp
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.