2015-10-10 113 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