2016-06-13 32 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”意思是,如果迎宾响应信息,响应将不会被传递 - 它可能最终与死信演员结束。