我陷入了这样的问题:我向演员发送消息,但没有收到具体的代码:

class TestActor extends Actor {
  def receive = {
    case _ =>
      println("null")
    case Landau(args) =>
      println("Got a Job" + args)
      sender ! "Done"
  }
}


和发送者,通过“询问”方法:

worker.ask(Landau(List("1", "2", "3")))


结果,它不会打印任何内容,也不会打印“ null”,有任何想法吗?

编辑:
这是在主要执行中:

val system = ActorSystem("TestApplication")
val ref = system.actorOf(Props(new TestActor), "test")


而且我不知道是否相关,但是主要对象和代码“ worker.ask ...”位于不同的程序包中

最佳答案

问题似乎在于这两行:

val worker = workerContext.actorFor("akka://TestApplication/user/test")
worker.ask(Landau(List("1", "2", "3")))


在第一行中,actorFor在Akka 2.2中已弃用,您现在应该使用actorSelection。 actorSelection的用法略有不同,因为它不像actorFor那样返回ActorRef,而是可以用来获取ActorRef的actorSelection。您可以通过发送Identify消息并接收包含所需ActorRef的ActorIdentity消息来做到这一点。或者,您仅使用ActorSelection的resolveOne方法,几次使用actorSelection,我总是以这种方式使用它。这将返回一个保存您的ActorRef的Future。所以你的代码应该是

val workerFuture = context actorSelection("/TestApplication/user/test") resolveOne
val worker = workerFuture = Await.result(actorFuture, 10 seconds)


第二个问题可能是,根据docs,ask需要稍微不同的语法:

worker ask Landau(List("1", "2", "3"))


试试看。

10-05 19:00