あなたが俳優の中context.actorSelection
を使用する場合、何を言っていることは(で/監修開始)この電流俳優の制御の下で俳優を見つけることです。 actor1はactor2によって開始されていない可能性がある(またはactor2によって監督されていない)ため、何も解決されません。 actor1がactor2によって実際に所有/開始された場合、おそらくcontext.actorSelection("/actor1")
を実行して、actor2のその子アクタを取得できます。あなたが検索を開始し、完全に役者へのパスを修飾する前に、すべての道「アップ」system
最初にしようとしているので、作品context.system.actorSelection
理由があります。あなたはあなたがsystem
から始まるそれを取得できるようになりますそのパスを使用して、system.actorOf
として、それを起動した場合、システムはactor1を「所有します」。
私が何を意味するか示すために少しコード:
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つのインスタンスを持っていることがわかります私のシステム。それは、ルックアップのパスだ、もう1つはそのパスに対して/user/actor1/actor2
に縛らActor1
のインスタンスから始めて1は/user/actor2
に縛らsys
から直接生み出されました。
アクター・システムは、階層的であり、この例ではそれを示しています。 ActorSystem
自体がすべてのルートです。アクターを選択することは、問題から選択するコンテキストをXPathに似ています。
は、以下を入力してください作業"?それはコンパイルされますか?実行時に例外がスローされますか? 'actor1'は' HelloResponse( "hello back1") 'メッセージを受け取りませんか?エラーメッセージには何が表示されますか? – agilesteel
私は何がうまくいかないかについての説明を追加しました。興味深いことに感謝します。 – lujop