我遇到了这样的问题:我发送消息给一个演员,但它没有收到,特别是代码:
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")))
因此,它不打印任何东西,既不“无效”,任何想法?
编辑: 这是主要的执行:
val system = ActorSystem("TestApplication")
val ref = system.actorOf(Props(new TestActor), "test")
我不知道是否相关,但主要对象和代码“worker.ask ...”在不同的包中
答案 0 :(得分:1)
问题似乎是这两行:
val worker = workerContext.actorFor("akka://TestApplication/user/test")
worker.ask(Landau(List("1", "2", "3")))
在第一行中,在Akka 2.2中弃用了actorFor,你现在应该使用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:
,问题需要略有不同的语法worker ask Landau(List("1", "2", "3"))
试一试。
答案 1 :(得分:0)
实测值: 所以,看起来它是方法actor的错误,我正在使用这个工人:
val worker = workerContext.actorFor("akka://TestApplication/user/test")
而不是:
val worker = workerContext.actorOf(Props[TestActor])
现在它有效。但我不确定这个选择,因为我应该指出那个地址。