アクターの内部で使用する場合context.actorSelection
、現在のアクターの制御下にあるアクターを見つける (開始/監視対象) ということです。アクター 1 はおそらくアクター 2 によって開始されていない (またはアクター 2 によって監視されていない) ため、何にも解決されません。アクター 1 が実際にアクター 2 によって所有/開始された場合、おそらくcontext.actorSelection("/actor1")
アクター 2 の子アクターを取得することができます。うまくいく理由は、検索を開始してアクターへのパスを完全に修飾する前に、最初に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
1 つは結ばれた場所から直接生成され、もう 1 つは結ばれたパス/user/actor2
のインスタンスから開始されました。Actor1
/user/actor1/actor2
アクター システムは階層的であり、この例はそれを示しています。それActorSystem
自体がすべての根源です。アクターの選択は、select from を発行するコンテキストが重要であるという点で XPath に似ています。