2016-04-12 32 views
0

Şu anda Akka HTTP içinde "actor-per-request" pattern proposed by NET-A-PORTER devs uygulamak çalışıyorum. Karşılaştığım sorun, bu desenin dokümanlardaki herhangi bir yerde belgelenmemiş olmasıdır. aşağıdakileri yapmak için bir yol olarak görünmüyor:Akka HTTP "istek üzerine aktör" desen

IO(Http) ! Http.Bind(serviceActor, "localhost", port = 38080) 

nasıl Sprey kullanmadan istek başına bir Akka aktör kullanabilirim?

+0

:

val handler : (ActorRef) => (HttpRequest) => Future[HttpResponse] = (actorRef) => (httpRequest) => (actorRef ask httpRequest).mapTo[HttpResponse] 

sunucu bağlayıcı şimdi biraz modifiye edilir. Bunun yerine, akka örneklerini takip edin. –

+0

https://github.com/akka/akka/issues/18569 'a göre, bu "oldukça yaygın bir desen" olarak kabul edilir, sadece akka-http – giannoug

+0

için belgelenmemiştir. Burada, "istek başına model aktörü" ile örnek uygulama bulabilirsiniz "https://github.com/pjfanning/swagger-akka-http-sample.git –

cevap

0

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) 
İlgili konular