我更喜歡使用噴霧服務的要求模式,和的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