6

为什么当我使用 ActorContext 选择绝对路径时它不起作用(未正确选择演员并且没有收到 HelloResponse 消息)?

//From Actor2:
//This doesn't work (Message never received)
context.actorSelection("/user/actor1") ! HelloResponse("hello back1")
//This works (actor 1 receives the message)
context.system.actorSelection("/user/actor1") ! HelloResponse("hello back2")

我是 Scala/Akka 的新手,但阅读文档似乎应该可行。

4

3 回答 3

4

这是一个错误,感谢您的提问:https ://www.assembla.com/spaces/ddEDvgVAKr3QrUeJe5aVNr/tickets/3276

于 2013-04-28T15:08:43.760 回答
2

当您context.actorSelection在演员内部使用时,您所说的是在当前演员控制下(由/监督)找到一个演员。由于 actor1 可能不是由 actor2 启动(或者不受 actor2 监督),所以它不会解决任何问题。如果 actor1 实际上是由 actor2 拥有/启动的,那么您可能会context.actorSelection("/actor1")得到 actor2 的那个子 actor。之所以有效,是因为在开始搜索并完全限定演员的路径之前,context.system.actorSelection您要一直“向上”到第一个。system如果您将其启动为 ,则系统“拥有”actor1 system.actorOf,因此使用该路径将允许您从system.

一个小代码来说明我的意思:

class Actor1 extends Actor{
  override def preStart = {
    context.actorOf(Props[Actor2], "actor2")
  }
  def receive = {
    case _ =>
  }
}

class Actor2 extends Actor{
  override def preStart = {println("my path is: " + context.self.path)}
  def receive = {
    case _ =>
  }
}

object FutureTesting {
  def main(args: Array[String]) {
    val sys = ActorSystem("test")
    implicit val ec = sys.dispatcher

    //Starting an Actor2 from system
    sys.actorOf(Props[Actor2], "actor2")

    //Starting an Actor1 from system which in turn starts an Actor2
    sys.actorOf(Props[Actor1], "actor1")
  }
}

运行此示例时,您将看到:

my path is: akka://test/user/actor1/actor2
my path is: akka://test/user/actor2

所以你可以看到Actor2我的系统中有 2 个实例正在运行;一个直接从sys被绑定到/user/actor2它的查找路径产生,一个从一个被Actor1绑定到/user/actor1/actor2它的路径的实例开始。

演员系统是分层的,这个例子表明了这一点。ActorSystem本身就是一切的根源。选择参与者与 XPath 类似,因为您发出 select from 事项的上下文。

于 2013-04-28T13:30:20.887 回答
1

actor2你将需要使用

context.actorSelection("/actor1")

我同意这并不直观,因为隐喻是文件系统,并且在使用文件系统时,前导/是绝对路径,意味着从根开始。也不一致,actorFor因为

context.actorFor("/user/actor1")

返回顶层Actor1(参见绝对和相对路径

编辑 - 这是 Akka 2.1.4 中修复的错误(参见 Roland 的回答)。从 2.1.4 开始,您可以使用context.actorSelection("/user/actor1").

于 2013-04-28T14:54:45.567 回答