我更喜欢使用喷雾服务的要求模式,和的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"
}
}
如果什么WorkerActor需要调用Actor2和Actor2调用Actor3和Actor3调用Actor4和Actor4是返回响应的一个。我是否仍然在每个演员中使用调用另一个演员的问题模式? – hajime
在这一点上,它成为一个常规的Akka设计问题/决定与几个选项。如果工作人员需要委托给另一个工作人员,它可以发送一条消息,其中包含收到原始消息的发件人的参与者。由于ask模式的工作原理,任何向原始'sender()'的actorRef发送消息的actor都将完成服务中的Future。 – mattinbits