Akka - Как перезагрузить дочерний элемент, порожденный маршрутизатором?

У меня есть Actor, который создает детей, используя Router. Когда один из детей терпит неудачу. Меня уведомляют в стратегии о сбое. Однако Actor не перезапускается сам по себе.

private static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.create("1 minute"),
        throwable -> {
            Directive directive;
            if (throwable instanceof SocketTimeoutException) {
                directive = SupervisorStrategy.restart();
            } else {
                directive = SupervisorStrategy.stop();
            }
            return directive;
        });

Я также узнал из этого сообщения SO, что если дочерний элемент Router завершается, Router не будет автоматически создавать нового потомка. А также, когда завершаются все дочерние маршрутизаторы, Router также завершает работу.

Теперь вопрос на миллион долларов: как правильно перезапустить дочерний элемент, порожденный Router?


person Ragunath Jawahar    schedule 18.11.2014    source источник


Ответы (1)


Кажется, вы используете маршрутизатор Pool (он запускает своих дочерних элементов). Вместо этого вы хотите использовать Group маршрутизатор (групповой маршрутизатор docs), и в этом случае вы создаете дочерние акторы и передаете их маршрутизатору. Это означает, что вы отвечаете (вы, как родительский актор этих маршрутов) полностью отвечаете за их жизненный цикл. Таким образом, вы бы определили стратегию контроля в родительском элементе, и все работало бы так, как вы хотите.

person Konrad 'ktoso' Malawski    schedule 18.11.2014
comment
Да, я использую RoundRobinPool. Воспользуюсь группой и свяжусь с вами по этому поводу. Спасибо. - person Ragunath Jawahar; 19.11.2014