Piy*_*joo 5 java akka-stream akka-http
我们正在考虑使用Akka-HTTP Java API - 使用路由DSL.
目前尚不清楚如何使用路由功能来响应HttpRequest; 使用Untyped Akka Actor.例如,在匹配Route路径时,我们如何将请求移交给"处理程序"ActorRef,然后它将以异步方式响应HttpResponse?
类似的问题发布在Akka-User邮件列表中,但没有后续解决方案 - https://groups.google.com/d/msg/akka-user/qHe3Ko7EVvg/KC-aKz_o5aoJ.
这可以通过onComplete指令和ask模式的组合来实现.
在下面的示例中,RequestHandlerActoractor用于创建HttpResponse基于HttpRequest.这个演员是从路线内被问到的.
我从来没有使用Java来路由代码,因此我的回复是在Scala中.
import scala.concurrent.duration._
import akka.actor.ActorSystem
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.model.HttpRequest
import akka.actor.Actor
import akka.http.scaladsl.server.Directives._
import akka.actor.Props
import akka.pattern.ask
import akka.util.Timeout
import scala.util.{Success, Failure}
import akka.http.scaladsl.model.StatusCodes.InternalServerError
class RequestHandlerActor extends Actor {
  override def receive = {
    case httpRequest : HttpRequest =>
      sender() ! HttpResponse(entity = "actor responds nicely")
  }
}
implicit val actorSystem = ActorSystem()
implicit val timeout = Timeout(5 seconds)
val requestRef = actorSystem actorOf Props[RequestHandlerActor]
val route = 
  extractRequest { request =>
    onComplete((requestRef ? request).mapTo[HttpResponse]) {
      case Success(response) => complete(response)
      case Failure(ex) => 
        complete((InternalServerError, s"Actor not playing nice: ${ex.getMessage}"))
    } 
  }
Run Code Online (Sandbox Code Playgroud)
然后可以bindAndHandle像使用任何其他Flow一样将此路由传递给方法.