0

我对 Akka 很陌生,并试图弄清楚如何从我的代码中获取结果,我有以下内容:

object MyClass extends Controller {

def createCluster(id: String, uuid: String, loc: String, size: String, quantity: Int, name: String) = { implicit request =>
Async{
Akka.future {
.....
  val system = ActorSystem("System")

  val master = system.actorOf(Props[Master], name = "master")
  val launch = Launch(s, d, request.user, quantity, clusterName)

  //val future = master ? launch
  implicit val timeout = Timeout(5 minutes)

  val future = Patterns.ask(master, launch, timeout) //master ? launch
  val result = Await.result(future.mapTo[ServerContainer], timeout.duration)
}
}

我的主要演员看起来像:

class Master() extends Actor {

def receive = {
case Launch(server, details, user, quantity, clusterName) => {
  d = details
  s = Some(server)
  u = Some(user)
  q = Some(quantity)
  cname = Some(clusterName)
  hostnameActor ! Host(BIServer.NONE, Server.PDI, Database.NONE, server.uuid.getOrElse(""), None)
}
case Host(bi,etl,db,uuid,name2) => {
  instance = name2
  h = Some(Host(bi,etl,db,uuid,name2))
  templateActor ! TemplateOpts(s.get, d.get, instance.get)
}

case TemplateContainer(client,temp,id, server, _, _, _,_, _) => {
  nodeActor ! TemplateContainer(client,temp,id, server, d.get, h, q, u, cname)}

case NodeContainer(server, details, meta, dns, host, key) => { n = Some(NodeContainer(server,details,meta,dns,host,q))
  etlServerActor ! n.get
}

case ServerContainer(server,details) => {
  sender ! ServerContainer(server, details)
}
}

所有参与者都成功执行,但即使根据调试器执行该行,ServerContainer 也永远不会返回给发送者,并且请求总是在 5 分钟后超时。

任何人都可以提供任何关于为什么的想法吗?

4

1 回答 1

1

sender你在范围内所指的 实际上case ServerContainerServerContainer消息的发送者,而不是原来的发送者Launch

您应该将该发件人的一些引用作为变量保存,或者通过将其与消息交换一起传递甚至更好

于 2013-09-13T23:43:30.803 回答