2015-10-10 108 views
4

我在我的應用程序中使用Spray,並從我在Github上看到的示例中看到,人們通過將HTTPContext對象傳遞給所有actor並在最後一名actor上調用onComplete { } Future來處理Akka中的HTTP請求。如何在Akka中管理HTTP請求?

在應用程序中發送上下文真的是個好主意嗎?這樣每個事件對象都有一個上下文參數。

我們如何處理HTTP請求&在Akka中正確響應?我已閱讀this文章,但我想知道在實現這一目標的正確方式下運行Akka的人們的想法。

回答

4

我更喜歡使用噴霧服務的要求模式,和的onSuccess指令,如:

trait MyService extends HttpService { 

    def worker: ActorRef 

    implicit def timeout:Timeout 

    implicit def ec:ExecutionContext 

    def askWorker: Future[String] = (worker ? "Hello").mapTo[String] 

    def myRoute = path("/") { 
    get { 
     onSuccess(askWorker){ 
     case str => complete(str) 
     } 
    } 
    } 
} 

然後,具體的演員,如:

class ServiceActor extends MyService with Actor { 

    implicit val ec = context.system 

    implicit val timeout = Timeout(3 seconds) 

    val worker = context.actorOf(Props[WorkerActor]) 

    override def actorRefFactory = context.system 

    def receive = runRoute(myRoute) 
} 

我喜歡這種模式,而不是傳遞請求上下文,因爲這意味着其他角色不必具有任何Http概念。該服務可以被完全替換爲不同的協議。在這個例子中,工人的演員可以是這樣的:

class WorkerActor extends Actor { 

    def receive = { 
    case "Hello" => sender() ! "Hello World" 
    } 
} 
+1

如果什麼WorkerActor需要調用Actor2和Actor2調用Actor3和Actor3調用Actor4和Actor4是返回響應的一個。我是否仍然在每個演員中使用調用另一個演員的問題模式? – hajime

+2

在這一點上,它成爲一個常規的Akka設計問題/決定與幾個選項。如果工作人員需要委託給另一個工作人員,它可以發送一條消息,其中包含收到原始消息的發件人的參與者。由於ask模式的工作原理,任何向原始'sender()'的actorRef發送消息的actor都將完成服務中的Future。 – mattinbits