Перезапуск Akka Actor после таймлапса

У меня есть актер-супервайзер, который создает пару дочерних актеров. Я также определил стратегию Supervision, которая выполняет обработку OneToOne:

  override val supervisorStrategy =
    OneForOneStrategy() {
      case _ =>
        logger.info("doing restart")
        Restart
    }

Я хотел бы знать, как я могу ввести тайм-аут для этого перезапуска, чтобы я хотел, скажем, 5 секунд, прежде чем я перезапущу детей? Я не вижу никакой документации Akka, указывающей мне на какие-либо настраиваемые тайм-ауты. Любые подсказки? Я не хочу иметь Thread.sleep(...). Это определенно вне уравнения. Любые другие предложения?


person joesan    schedule 02.05.2016    source источник


Ответы (2)


Как насчет переопределения OneForOneStrategy с такими параметрами, как:

OneForOneStrategy(maxNrOfRetries = 6, withinTimeRange = 1.minute) {
  ...
  ...
}

Это гарантирует, что дочерние актеры будут перезапущены только 6 раз в течение 1 минуты!

person joesan    schedule 02.05.2016
comment
Это попытается перезапустить дочерний элемент N раз за временной интервал. Интервалы, через которые делаются эти попытки, не определены, равно как и интервал времени, который проходит до того, как будет сделана первая попытка. - person nattyddubbs; 02.05.2016

Вы можете использовать настроенный супервизор отсрочки. с минимальным и максимальным отставанием, равными друг другу.

Обратите внимание, что существует два разных типа экземпляров отсрочки. Один для onStop и один для onFailure. В вашем случае я бы использовал onFailure, так как это супервизор, настроенный на обработку исключений.

person nattyddubbs    schedule 02.05.2016
comment
BackoffSupervisor перезапускает дочерний элемент с возрастающей задержкой. может мне это и не нужно! Как насчет переопределения параметров maxNrOfRetries и внутриTimeRange для OneForOneStrategy? Это делает именно то, что я хочу! - person joesan; 02.05.2016
comment
Все зависит от конфигурации. Если вы настроите минимальную отсрочку и максимальную отсрочку, они будут ждать это количество времени, прежде чем пытаться перезапустить дочерний процесс. - person nattyddubbs; 02.05.2016