Актер Akka не может отправить себе PoisonPill - PullRequest
0 голосов
/ 02 ноября 2018

Ява / Акка здесь. У меня есть следующий актер:

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 голосов
/ 02 ноября 2018

Сообщение журнала не появляется, потому что PoisonPill является AutoReceivedMessage. AutoReceivedMessage - это специальный тип сообщения, который Akka обрабатывает внутри и не предназначен для сопоставления с шаблоном в пользовательском коде.

Один из способов выключить систему актера, когда актер «отравлен» / остановлен, - переопределить метод 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();
}
...