3

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

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 ...”在不同的包中

4

2 回答 2

1

问题似乎是这两行:

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。您可以通过发送识别消息并接收包含所需 ActorRef 的 ActorIdentity 消息来完成此操作。或者你干脆用ActorSelection的resolveOne方法,我几次用actorSelection,一直都是这样用的。这将返回一个持有您的 ActorRef 的 Future。所以你的代码应该是

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

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

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

试试看。

于 2013-10-09T15:15:31.653 回答
0

发现:所以,看起来是actorFor方法的错误,我使用的是这个worker:

val worker = workerContext.actorFor("akka://TestApplication/user/test")

而不是这个:

val worker = workerContext.actorOf(Props[TestActor])

现在它可以工作了。但我不确定这个选择,因为我应该指向那个地址。

于 2013-10-09T15:19:30.767 回答