当您在演员内部使用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,因为您正在发布选择的上下文。
请提供以下信息:1)斯卡拉/阿卡版本2),显示了如何'actor1'创建3)什么是你的意思代码“不工作”?它是否编译?它是否在运行时抛出异常? 'actor1'没有收到'HelloResponse(“hello back1”)消息?错误信息是什么意思? – agilesteel 2013-04-28 10:56:18
我添加了一个关于什么是不正常的解释,谢谢你的兴趣。 – lujop 2013-04-28 15:23:02