理解akka hello-world示例

时间:2016-06-13 14:46:12

标签: java akka

我正在学习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我们从演员greeting1收到它(inbox)。为什么?消息是如何与inbox结束的?我们没有将其发送给inbox。这是一种奇迹......

II。在//3发生的情况几乎相同。我们告诉noSender然后从inbox ...

收到它

2 个答案:

答案 0 :(得分: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确认并检索现在放置在收件箱中的邮件之前调用它。尽管在actor系统中不存在消息的目标,但是actor系统本身正在接收该消息。

ActorRef.noSender()似乎意味着问候并非来自不同的演员;当actor向前发送消息时,这可能会变成发送它的actor的唯一ActorRef(因此你可以将消息跟踪到前一个actor)。

答案 1 :(得分:0)

在这些方面:

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

&#34; greeter&#34;对象正在发送消息 - 一个新的&#34; WhoToGreet&#34;对象 - 没有指定的发件人。 Greeter将收到消息。

什么&#34; noSender&#34;意思是如果欢迎者回应消息,响应将不会被传递 - 它可能会以死信演员结束。