当您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 事项的上下文。