我正在学习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收到.
发布于 2016-06-13 15:07:38
这一行命令收件箱使用对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 (因此您可以将消息跟踪到前一个参与者)。
发布于 2016-06-20 18:43:23
在以下几行:
greeter.tell(new WhoToGreet("akka"), ActorRef.noSender()); //1 <------- Here“迎宾”对象正在发送消息--一个新的"WhoToGreet“对象--没有指定的发送方。问候者会收到留言的。
"noSender“的意思是,如果问候者对信息做出回应,那么回复就不会被传递--它很可能会以死信演员结束。
https://stackoverflow.com/questions/37792765
复制相似问题