Я экспериментирую со стратегией 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.