2013-04-28 10 views
6

なぜ私はそれがない作品(俳優が正しく選択されていないとHelloResponseメッセージを受信しない)んActorContextとの絶対パスを選択しますか?俳優の選択

//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") 

私はそれが動作するはずと思われるreading documentationのScala /アッカへの初心者だけど。

+0

は、以下を入力してください作業"?それはコンパイルされますか?実行時に例外がスローされますか? 'actor1'は' HelloResponse( "hello back1") 'メッセージを受け取りませんか?エラーメッセージには何が表示されますか? – agilesteel

+0

私は何がうまくいかないかについての説明を追加しました。興味深いことに感謝します。 – lujop

答えて

2

あなたが俳優の中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に似ています。

1

actor2からは、私はそれがメタファーはファイルシステムで、ファイルシステムを使用する際の主要/がルートにスタートを意味し、絶対パスが指定された直感的ではありません同意

context.actorSelection("/actor1") 

を使用する必要があります。

context.actorFor("/user/actor1") 

はトップレベルActor1Absolute and Relative Pathsを参照)

EDITを返すためにも、それはactorForと矛盾している - これは(ローランドの回答を参照してください)アッカ2.1.4で修正されたバグでした。 2.1.4以降ではcontext.actorSelection("/user/actor1")を使用できます。

+0

最初のスニペット:context.actorSelection( "/ actor1")も機能しません。スラッシュが存在する場合、ActorSelectionはルートガーディアンからRolandの言及として開始して解決します。 – neowulf33

+0

これは動作していましたが、バグで修正されました。 – sourcedelica

+0

Akka 2でテスト済みです。3-M2、context.actorSelection( "/ actor1")は機能しません。 ActorSelectionはルートガーディアンで解決を開始します。 – neowulf33