6

ActorContext で絶対パスを選択すると機能しないのはなぜですか (アクターが正しく選択されておらず、HelloResponse メッセージを受信しません)。

//From Actor2:
//This doesn't work (Message never received)
context.actorSelection("/user/actor1") ! HelloResponse("hello back1")
//This works (actor 1 receives the message)
context.system.actorSelection("/user/actor1") ! HelloResponse("hello back2")

私はScala/Akkaの初心者ですが、ドキュメントを読むとうまくいくようです。

4

3 に答える 3

4

これはバグです。お問い合わせいただきありがとうございます: https://www.assembla.com/spaces/ddEDvgVAKr3QrUeJe5aVNr/tickets/3276

于 2013-04-28T15:08:43.760 に答える
2

アクターの内部で使用する場合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 つのインスタンスが実行されていることがわかります。sys1 つは結ばれた場所から直接生成され、もう 1 つは結ばれたパス/user/actor2のインスタンスから開始されました。Actor1/user/actor1/actor2

アクター システムは階層的であり、この例はそれを示しています。それActorSystem自体がすべての根源です。アクターの選択は、select from を発行するコンテキストが重要であるという点で XPath に似ています。

于 2013-04-28T13:30:20.887 に答える
1

あなたからactor2使用する必要があります

context.actorSelection("/actor1")

比喩がファイルシステムであり、ファイルシステムを使用する場合、先頭/はルートから始まることを意味する絶対パスであることを考えると、直感的ではないことに同意します。また、それは矛盾してactorForいます

context.actorFor("/user/actor1")

最上位レベルを返しますActor1(絶対パスと相対パスを参照)

編集 - これは Akka 2.1.4 で修正されたバグでした (Roland の回答を参照)。2.1.4 以降から使用できますcontext.actorSelection("/user/actor1")

于 2013-04-28T14:54:45.567 に答える