Scala 演员选择

Scala 演员选择,scala,akka,Scala,Akka,为什么当我使用ActorContext选择一个绝对路径时它不起作用(参与者没有被正确选择并且没有收到Hello响应消息) 我是Scala/Akka的新手,但这似乎应该有用。当您在演员内部使用context.actorSelection时,您要说的是在当前演员控制下查找演员(由开始/由监督)。因为actor1可能不是由actor2启动的(或者不是由actor2监督的),所以它不会解决任何问题。如果actor1实际上是由actor2拥有/启动的,那么您可能可以执行context.actorSelec

为什么当我使用ActorContext选择一个绝对路径时它不起作用(参与者没有被正确选择并且没有收到Hello响应消息)


我是Scala/Akka的新手,但这似乎应该有用。

当您在演员内部使用
context.actorSelection
时,您要说的是在当前演员控制下查找演员(由开始/由监督)。因为actor1可能不是由actor2启动的(或者不是由actor2监督的),所以它不会解决任何问题。如果actor1实际上是由actor2拥有/启动的,那么您可能可以执行
context.actorSelection(“/actor1”)
来获取actor2的子actor。之所以
context.system.actor选择
有效,是因为在开始搜索并完全限定参与者路径之前,您首先要“向上”到
system
。如果您将actor1作为
System.actorOf
启动,则System“拥有”actor1,因此使用该路径将允许您从
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
实例;一个直接从绑定到
/user/actor2
作为其查找路径的
sys
生成,另一个从绑定到
/user/Actor1/actor2
作为其路径的
Actor1
实例开始


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

from
actor2
您将需要使用

context.actorSelection("/actor1")
我同意这是不直观的,因为隐喻是一个文件系统,当使用文件系统时,前导的
/
是一个绝对路径,意味着从根开始。而且它与的
actor不一致,因为

context.actorFor("/user/actor1")
返回顶级
Actor1
(请参阅)


编辑-这是Akka 2.1.4中修复的一个错误(参见罗兰的答案)。从2.1.4开始,您可以使用
context.actorSelection(“/user/actor1”)
这是一个bug,感谢您的提问:

请提供以下内容:1)Scala/Akka版本2)显示如何创建
actor1
的代码3)您所说的“不工作”是什么意思?它编译吗?它是否在运行时抛出异常?
actor1
没有收到
helloreresponse(“hello back1”)
消息吗?错误消息是怎么说的?我添加了一个关于什么不起作用的解释,感谢您的关注。第一个片段:context.actorSelection(“/actor1”)也不起作用。如果正斜杠存在,ActorSelection将从Roland提到的根guardian开始解析。它可以正常工作,但是一个bug,后来被修复。刚刚用Akka 2.3-M2进行了测试,而context.ActorSelection(“/actor1”)不起作用。ActorSelection将在根guardian上开始解析。它在2.1.4中已修复
context.actorFor("/user/actor1")