Акка эскалация стратегии надзора останавливает детей - PullRequest
0 голосов
/ 07 октября 2018

Я экспериментирую со стратегией OneForOneStrategy, которая увеличивает неудачу.Моя структура Actor: Supervisor -> Slave, где Slave является дочерним элементом Supervisor.

Slave отвечает на 2 сообщения - " fail " (выдает исключение) и " work"(делает некоторые записи)

Моя первая проблема заключалась в том, что, если Slave отказывал, Supervisor перезапускался (из-за стратегии эскалации Guardian перезапускал его), однако Slave останавливался и не перезапускался.

Полагаю, в этом поведении по умолчанию есть причина остановки детей вместо их перезапуска.Не могли бы вы объяснить это дизайнерское решение?В каких случаях это лучший подход, чем перезапуск?

Моя проблема с поведением заключалась в том, что входящие сообщения Slave выглядели так: " work ", " fail ",« работа ».

После сбоя последнее сообщение «работа» заканчивалось мертвой буквой, поскольку ведомое устройство было остановлено и запущено (при инициализации Supervisor).Решением было переопределить метод preRestart:

@Override
public void preRestart(Throwable reason, Optional<Object> message) throws Exception {
    postStop();
}

Это устранило проблему и привело к перезапуску детей.Мне также пришлось изменить инициализацию Slave в Supervisor.

1 Ответ

0 голосов
/ 11 октября 2018

Причина, по которой дети останавливаются, заключается в том, что они рассматриваются как часть внутреннего состояния актера, а когда актер перезапускается, он начинает его с чистого листа, так сказать.

Каквы отметили, что можете отказаться от него, переопределив preRestart.

Мы возвращаемся к этому поведению по умолчанию для Akka Typed, который является следующим поколением API актера Akka, вы можете увидеть здесь некоторые обсуждения, если выЛюбопытны: https://github.com/akka/akka/issues/25556

...