Java “ActorRef.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

我开始学习Akka,并从以下网站下载了示例:

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

主要方法如下:

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