繁体   English   中英

了解Akka Hello World示例

[英]Understanding akka hello-world example

我正在学习Akka ,现在我想了解他们的基本Hello-world示例 (片段):

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);

    //...
}

这是怎么回事?

I.在//1 ,演员greeterWhoToGreet("akka")消息WhoToGreet("akka")给没有发送者。 因此, 没有人会收到它。 但是由于某些不清楚的原因,我们在//2处从actor inbox收到了它( greeting1 )。 为什么? inbox的邮件如何显示? 我们没有将其发送到inbox 有点奇迹...

二。 //3发生的情况几乎相同。 我们告诉noSender,然后从inbox接收它...

这行告诉收件箱使用给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()似乎表示问候不是来自其他ActorRef.noSender() 当actor向前发送消息时,这很可能会变成发送该actor的actor的唯一ActorRef(因此您可以将消息跟踪到前一个actor)。

在这些行中:

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

正在向“问候”对象发送消息-一个新的“ WhoToGreet”对象-没有指定的发送者。 迎宾员将收到该消息。

“ noSender”的意思是,如果迎接者响应该消息,则该响应将不会被传递-最终可能会导致死信参与者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM