У меня есть кластер Akka с 2 узлами, и я развертываю его с использованием стратегии непрерывного обновления.
Actor A
отправляет сообщение на Actor B
и становится поведением, которое ожидает ответа.
Пример Actor A
реализация:
class ActorA extends AbstractActor {
private ActorRef sender;
static Props props () {
return Props.create(ActorA.class);
}
@Override
public Receive createReceive() {
return ReceiveBuilder.create()
.matchAny(msg -> {
sender = getSender();
getContext().become(waiting());
})
.build();
}
private Receive waiting() {
return ReceiveBuilder.create()
.matchAny(msg -> sender.tell("COMPLETE", getSelf()))
.build();
}
}
Развертывание происходит одновременно, поэтому узел, содержащий Actor A
, получает SIGTERM
и начинает постепенное завершение работы. Из того, что я понял из документов Akka, изящное завершение работы включает отправку PoisonPill
всем актерам на узле.
Так что же происходит с Actor A
? Он ожидал ответа от Actor B
, но теперь получил PoisonPill
. Что происходит, когда Actor B
отвечает отправителю?
В моем случае Actor A
никогда не получит ответ.