Scala actor:不接收消息

时间:2013-10-09 07:44:29

标签: scala akka actor

我遇到了这样的问题:我发送消息给一个演员,但它没有收到,特别是代码:

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

2 个答案:

答案 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])

现在它有效。但我不确定这个选择,因为我应该指出那个地址。