Java “ActorRef.tell”方法的第二个参数是什么?
我开始学习Akka,并从以下网站下载了示例: 我不明白tell方法第二个参数的用法: 主要方法如下:Java “ActorRef.tell”方法的第二个参数是什么?,java,akka,actor,Java,Akka,Actor,我开始学习Akka,并从以下网站下载了示例: 我不明白tell方法第二个参数的用法: 主要方法如下: howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); 因此,第二个论点是ActorRef.noSender 在参与者端,入口点如下所示: @Override public Receive createReceive() { return receiveBuilder() .match(WhoToGreet
howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender());
因此,第二个论点是ActorRef.noSender
在参与者端,入口点如下所示:
@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
})
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Greeting.class, greeting -> {
log.info(greeting.message);
})
.build();
}
因此,我无法访问传递的引用
此外,您可以看到,如果消息类型为Greet.class,则此参与者会将消息发送给另一个参与者
这里的第二个参数是getSelf,但我试图用ActorRef.noSender改变它,行为并没有改变
打印机参与者入口点如下所示:
@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
})
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Greeting.class, greeting -> {
log.info(greeting.message);
})
.build();
}
因此,它只打印提供的消息
这里的第二个参数是getSelf,但我试图用ActorRef.noSender改变它,行为并没有改变
该方法的第二个参数是发送方引用,接收方参与者可以向其发送回复。换句话说,如果参与者A向参与者B发送一条消息,其中getSelf作为tell调用的第二个参数,那么参与者B可以使用getSender获取对参与者A的引用。当接收方参与者不需要对发送方的引用时,将ActorRef.noSender作为第二个参数传递是合适的。请注意,您可以使用任何ActorRef作为第二个参数来说明
《快速入门指南》中的打印机角色在收到问候语时不会调用getSender。打印机参与者在收到问候语消息时唯一要做的事情就是记录问候语。在这种情况下,迎宾参与者使用ActorRef.noSender而不是getSelf会更有意义,但在这种情况下,这没有什么区别,因为打印机参与者不调用getSender:
如果希望了解如何使用发件人引用,可以更改打印机参与者的行为:
@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类:
这里的第二个参数是getSelf,但我试图用ActorRef.noSender改变它,行为并没有改变
该方法的第二个参数是发送方引用,接收方参与者可以向其发送回复。换句话说,如果参与者A向参与者B发送一条消息,其中getSelf作为tell调用的第二个参数,那么参与者B可以使用getSender获取对参与者A的引用。当接收方参与者不需要对发送方的引用时,将ActorRef.noSender作为第二个参数传递是合适的。请注意,您可以使用任何ActorRef作为第二个参数来说明
《快速入门指南》中的打印机角色在收到问候语时不会调用getSender。打印机参与者在收到问候语消息时唯一要做的事情就是记录问候语。在这种情况下,迎宾参与者使用ActorRef.noSender而不是getSelf会更有意义,但在这种情况下,这没有什么区别,因为打印机参与者不调用getSender:
如果希望了解如何使用发件人引用,可以更改打印机参与者的行为:
@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();
}