HttpExt
クラスは、この目的のために使用できる方法bindAndHAndleAsync
を持っています。このメソッドは次のシグネチャを持つ関数になります:だから
handler: (HttpRequest) ⇒ Future[HttpResponse]
、我々はHttpRequest
について尋ねられたときHttpResponse
を生産する俳優があるとします。
class HttpResponseHandlerActor extends Actor {
override def receive = {
case _ : HttpRequest =>
sender() ! HttpResponse(200, entity = "Response From Actor")
}
}
非効率的な回答を
あなたの質問は、要求ごとに1人のActorを使用する方法を明示的に求め、Actorクラスを使用してハンドラ関数を作成することができます:
一般的に、
val serverBinding : Future[ServerBinding] =
Http().bindAndHandleAsync(handler, "localhost", 8080)
効率的な回答
リクエストごとに新しいアクターを再作成するために、通常は必要ありません:
implicit val actorSystem = ActorSystem()
implicit val timeout = Timeout(5 seconds)
val handler : (HttpRequest) => Future[HttpResponse] = (httpRequest) = {
val actorHandlerRef =
system.actorOf(Props[HttpResponseHandlerActor], "responseActor")
(actorHandlerRef ask httpRequest).mapTo[HttpResponse]
}
現在で当社のサーバーをバインドするために、この機能を使用することができます1つのアクターを作成し、それをすべての要求に使用したいとします。
そこで我々はhandler
の外に俳優の作成を移動することができます。
val handler : (ActorRef) => (HttpRequest) => Future[HttpResponse] =
(actorRef) => (httpRequest) =>
(actorRef ask httpRequest).mapTo[HttpResponse]
を結合サーバーは現在、わずかに変更されます。
val singleResponseActorRef =
system.actorOf(Props[HttpResponseHandlerActor], "responseActor")
val serverBinding : Future[ServerBinding] =
Http().bindAndHandleAsync(handler(singleResponseActorRef),
"localhost",
8080)
私はこのパターンに従わないでしょう。代わりに、akkaの例に従ってください。 –
https://github.com/akka/akka/issues/18569によると、これは「かなり一般的なパターン」とみなされ、akka-http – giannoug
については記載されていません。ここでは、「actor per request pattern "https://github.com/pjfanning/swagger-akka-http-sample.git –