Akka演员无法向自己发送毒药

时间:2018-11-02 19:55:09

标签: java java-8 akka

Java / Akka在这里。我有以下演员:

public class MyActor extends AbstractActor {
    private Logger log = LoggerFactory.getLogger(this.getClass());

    public MyActor() {
        super();
    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(Init.class, init -> {
                log.info("Sending myself a Poison Pill...");
                self().tell(PoisonPill.getInstance(), self());
            }).match(PoisonPill.class, poisonPill -> {
                log.info("Got the Poison Pill...");
                context().system().terminate();
            }).build();
    }
}

当它收到Init消息时,我看到以下日志语句写成:

Sending myself a Poison Pill...

但是我从不看到:

Got the Poison Pill...

此外,该应用只是坐在那里,并没有按预期关闭。我在使用self().tell(PoisonPill.getInstance(), self())时有什么阻止它接收消息并关闭的方法?

1 个答案:

答案 0 :(得分:5)

由于PoisonPillAutoReceivedMessage,因此不会显示日志消息。 AutoReceivedMessage是Akka内部处理的一种特殊类型的消息,并不是要在用户代码中进行模式匹配。

一旦actor被“毒化” /停止,关闭actor系统的一种方法是重写actor的postStop()方法:

@Override
public Receive createReceive() {
  return receiveBuilder()
    .match(Init.class, init -> {
      log.info("Sending myself a Poison Pill...");
      self().tell(PoisonPill.getInstance(), ActorRef.noSender());
    })
    .build();
}

@Override
public void postStop() {
  getContext().getSystem().terminate();
}