2016-06-13 8 views
0

を理解する:私は<code>Akka</code>を学んだし、今、私は彼らの基本的な<a href="http://www.lightbend.com/activator/template/hello-akka-java8#code/src/main/java/HelloAkka.java" rel="nofollow"><strong>Hello-world example</strong></a>(フラグメント)を理解しようとしているアッカハロー世界の例

public static void main(String[] args) throws TimeoutException { 
    // Create the 'helloakka' actor system 
    final ActorSystem system = ActorSystem.create("helloakka"); 

    // Create the 'greeter' actor 
    final ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter"); 

    // Create the "actor-in-a-box" 
    final Inbox inbox = Inbox.create(system); 

    // Tell the 'greeter' to change its 'greeting' message 
    greeter.tell(new WhoToGreet("akka"), ActorRef.noSender()); //1 <------- Here 

    // Ask the 'greeter for the latest 'greeting' 
    // Reply should go to the "actor-in-a-box" 
    inbox.send(greeter, new Greet()); 

    // Wait 5 seconds for the reply with the 'greeting' message 
    Greeting greeting1 = (Greeting) inbox.receive(Duration.create(5, TimeUnit.SECONDS)); 
    System.out.println("Greeting: " + greeting1.message); //2 <-------- Here 

    // Change the greeting and ask for it again 
    greeter.tell(new WhoToGreet("typesafe"), ActorRef.noSender()); //3 <--- Here 
    inbox.send(greeter, new Greet()); 
    Greeting greeting2 = (Greeting) inbox.receive(
          Duration.create(5, TimeUnit.SECONDS)); //4 <-------------- Here 
    System.out.println("Greeting: " + greeting2.message); 

    //... 
} 

はここまで何が起こっているの?

私は//1で、俳優greeterは、送付者にメッセージWhoToGreet("akka")を火災忘れさせます。だから誰もがそれを受け取るでしょう。しかし、いくつかの不明な理由により、//2に俳優inboxからそれが届きます(greeting1)。どうして?メッセージはinboxとどのように鳴りましたか?我々はそれをinboxに送っていませんでした。それは奇跡のようなものです...

II。 //3では、ほぼ同じことが起こっています。それは認めることinbox.receiveを使用する前に、

// Ask the 'greeter for the latest 'greeting' 
// Reply should go to the "actor-in-a-box" 
inbox.send(greeter, new Greet()); 

と呼ばれている:私たちは、これはgreeterアクターに与えられた挨拶を消費するように受信トレイを告げる行さ

答えて

2

... inboxからrecievinその後、noSenderに伝え、受信トレイに現在置かれているメッセージを取得します。メッセージのターゲットは俳優システムには存在しませんが、俳優システム自体はがメッセージを受け取ります。

ActorRef.noSender()は、挨拶が別の俳優から来ていないことを意味するように見えます。アクターがメッセージを転送すると、これはそれを送信するアクターの一意のActorRefに変更される可能性があります(したがって、前のアクターにメッセージをトレースすることができます)。

+2

ああ、 'actorRef.tell(msg、anotherActorRef) 'と呼ばれると、' anotherActorRef'によって参照されたアクターが 'msg'を' actorRef'に送ります。 – Alupkers

0

これらの行では:

greeter.tell(new WhoToGreet("akka"), ActorRef.noSender()); //1 <------- Here 

「グリーター」オブジェクトは、メッセージ送信されている - ない指定された送信者と - 新しい「WhoToGreet」オブジェクト。グリーターがメッセージを受け取ります。

「noSender」とは、挨拶者がメッセージに応答した場合、応答が配信されないことです。デッドレターの俳優になる可能性があります。

関連する問題

 関連する問題