我正在学习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
...
答案 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;意思是如果欢迎者回应消息,响应将不会被传递 - 它可能会以死信演员结束。