2016-06-13 58 views
0

我學習Akka,現在我想了解他們的基本Hello-world example(片段):瞭解阿卡你好世界的例子

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。這是一種奇蹟......

二。在//3幾乎是相同的。我們告訴noSender,然後從inbox recievin吧...

回答

2

這是告訴收件箱中消耗給予greeter演員問候行:

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

這就是所謂的使用inbox.receive之前確認並檢索現在放在收件箱中的郵件。雖然該消息的目標在演員系統中不存在,但演員系統本身正在接收該消息。

ActorRef.noSender()似乎意味着問候不是來自不同的演員;當演員向前發送消息時,這很可能會變成爲發送者的唯一ActorRef(因此您可以將消息跟蹤到前一個演員)。

+2

啊,如果我們調用'actorRef.tell(msg,anotherActorRef)'意味着由'anotherActorRef'引用的actor將'msg'發送給'actorRef',對吧? – Alupkers

0

在這些行:

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

了「歡迎程序」對象正被髮送的消息 - 一個新的「WhoToGreet」對象 - 沒有指定發送者。 Greeter將收到該消息。

什麼「noSender」意思是,如果迎賓響應信息,響應將不會被傳遞 - 它可能最終與死信演員結束。