HttpExt
sınıfında, bu amaç için kullanılabilecek bir bindAndHAndleAsync
yöntemi vardır. Bu yöntem aşağıdaki imzası ile bir fonksiyonu alır: Yani
handler: (HttpRequest) ⇒ Future[HttpResponse]
, biz HttpRequest
sorulduğunda bir HttpResponse
üretecek bir Erkek Oyuncu olduğunu varsayalım:
class HttpResponseHandlerActor extends Actor {
override def receive = {
case _ : HttpRequest =>
sender() ! HttpResponse(200, entity = "Response From Actor")
}
}
Verimsiz Yanıt
Sorunuz, her istek için 1 Aktörün nasıl kullanılacağını açık bir şekilde anlatıyor, bunu yapmak için artık bir İşleyici sınıfı oluşturmak için Aktör sınıfımızı kullanabiliriz:
tipik
val serverBinding : Future[ServerBinding] =
Http().bindAndHandleAsync(handler, "localhost", 8080)
Verimli Yanıt
Her istek için yeni bir Aktör yeniden oluşturmak için genellikle gerekli değildir:
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]
}
Şimdi bizim sunucu bağlamak için bu işlevi kullanabilirsiniz 1 Aktör oluşturmak ve her istek için kullanmak istiyorsunuz.
nedenle handler
dışına Aktör oluşturulmasını taşıyabilirsiniz: ben bu tipini bilmek istemiyorum
val singleResponseActorRef =
system.actorOf(Props[HttpResponseHandlerActor], "responseActor")
val serverBinding : Future[ServerBinding] =
Http().bindAndHandleAsync(handler(singleResponseActorRef),
"localhost",
8080)
:
sunucu bağlayıcı şimdi biraz modifiye edilir. Bunun yerine, akka örneklerini takip edin. –
https://github.com/akka/akka/issues/18569 'a göre, bu "oldukça yaygın bir desen" olarak kabul edilir, sadece akka-http – giannoug
için belgelenmemiştir. Burada, "istek başına model aktörü" ile örnek uygulama bulabilirsiniz "https://github.com/pjfanning/swagger-akka-http-sample.git –