我陷入了这样的问题:我向演员发送消息,但没有收到具体的代码:
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"))
试试看。