gpt4 book ai didi

java - "ActorRef.tell"方法的第二个参数是什么?

转载 作者:行者123 更新时间:2023-11-29 08:29:17 26 4
gpt4 key购买 nike

我开始学习Akka并从official guid下载了示例:

我不明白tell方法第二个参数的用法:

在main方法中写入:

howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender());

因此第二个参数是ActorRef.noSender()

Actor 端入口点看起来像这样:

@Override
public Receive createReceive() {
return receiveBuilder()
.match(WhoToGreet.class, wtg -> {
this.greeting = message + ", " + wtg.who;
})
.match(Greet.class, x -> {
//#greeter-send-message
printerActor.tell(new Greeting(greeting), getSelf());
//#greeter-send-message
})

因此我无法访问传递的引用。

此外,您还可以看到,如果消息类型为 Greet.class,则该 Actor 会向另一个 Actor 发送消息

printerActor.tell(new Greeting(greeting), getSelf());

这里的第二个参数是 getSelf(),但我尝试使用 ActorRef.noSender() 更改它,但行为没有改变。

打印机参与者入口点如下所示:

@Override
public Receive createReceive() {
return receiveBuilder()
.match(Greeting.class, greeting -> {
log.info(greeting.message);
})
.build();
}

因此它只打印提供的消息

最佳答案

printerActor.tell(new Greeting(greeting), getSelf());

Here second argument is getSelf() but I tried to change it with ActorRef.noSender() and behaviour was not changed.

tell() 的第二个参数method 是接收者 Actor 可以向其发送回复的发送者引用。换句话说,如果参与者 A 向参与者 B 发送一条消息,并将 getSelf() 作为 tell() 调用的第二个参数,则参与者 B 可以使用 getSender() 来获取对 actor A 的引用。当接收 actor 不需要对发送者的引用时,传递 ActorRef.noSender() 作为第二个参数是合适的。请注意,您可以使用任何 ActorRef 作为 tell() 的第二个参数。

快速入门指南中的打印机 Actor 在收到 Greeting 消息时不会调用 getSender()。打印机 Actor 在收到 Greeting 消息时所做的唯一事情就是记录问候语。在这种情况下,欢迎 Actor 使用 ActorRef.noSender() 而不是 getSelf() 更有意义(但是,同样,在这种情况下,它使得没有区别,因为打印机 Actor 不会调用 getSender()):

printerActor.tell(new Greeting(greeting), ActorRef.noSender());

如果您想了解如何使用发件人引用,您可以更改打印机参与者的行为:

@Override
public Receive createReceive() {
return receiveBuilder()
.match(Greeting.class, greeting -> {
log.info(greeting.message);
getSender().tell(new PrinterAck(), ActorRef.noSender());
})
.build();
}

然后更改greeter actor来处理PrinterAck消息(显然您需要定义一个PrinterAck类):

@Override
public Receive createReceive() {
return receiveBuilder()
.match(WhoToGreet.class, wtg -> {
this.greeting = message + ", " + wtg.who;
})
.match(Greet.class, x -> {
printerActor.tell(new Greeting(greeting), getSelf());
})
.match(PrinterAck.class, x -> {
log.info("Received an ack from the printer actor.");
})
.build();
}

关于java - "ActorRef.tell"方法的第二个参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49649745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com