在Actor字段

时间:2015-12-28 10:08:52

标签: java akka

我是Akka的新手,我很高兴有Akka经验的人可以帮助我。我阅读了以下文章http://doc.akka.io/docs/akka/2.4.1/java/untyped-actors.html,其中包括标题"生命周期监控,又名死亡观察"包含以下示例:

public class WatchActor extends UntypedActor {
  final ActorRef child = this.getContext().actorOf(Props.empty(), "child");
  {
    this.getContext().watch(child); // <-- the only call needed for registration
  }
  ActorRef lastSender = getContext().system().deadLetters();

  @Override
  public void onReceive(Object message) {
    if (message.equals("kill")) {
      getContext().stop(child);
      lastSender = getSender();
    } else if (message instanceof Terminated) {
      final Terminated t = (Terminated) message;
      if (t.getActor() == child) {
        lastSender.tell("finished", getSelf());
      }
    } else {
      unhandled(message);
    }
  }
}

对于我来说,我们不清楚为什么我们可以在actor字段lastSender中保存发送者ref。例如我们可以有以下情况:演员A向WatchActor发送kill消息,我们保存在WatchActor的lastSender字段引用演员A,然后演员B发送kill消息给WatchActor,我们保存在WatchActor的lastSender字段引用演员B,观看演员接收器来自儿童演员的终止消息和对演员B的回答,但演员A将不会收到答案。这段代码不正确吗?

1 个答案:

答案 0 :(得分:0)

您所描述的内容可能是正确的,因此该示例并非完全安全,并且如果多个actor将“kill”消息发送到WatchActor,则可能会产生意外结果。在这方面,文档中的示例可能会得到改进。

这很烦人,但可能与文档部分没有超级相关性,这主要描述了一个演员在观看的另一个演员被停止并且异步发生时将如何接收Terminated

如果您认为这是非常重要,请在此处提交:https://github.com/akka/akka/issues