2015-06-21 3 views
0

Java API здесь. Я пытаюсь понять, как действует аккорский надзор Akka, в частности стратегии супервайзера. Для меня стратегия чувствует как ее просто (по существу) отображение исключений в директивы.Отношения Akka SupervisorСтратегии с детьми

Я только что прочитал официальный Akka Fault Tolerance documentation, но нигде в этом документе они фактически не указывают, когда/где/как запускаются стратегии контроля.

Итак, я спрашиваю: когда действуют стратегии надзора? Когда ребенок-актер выбрасывает Throwable из своего метода onReceive? Или что-то другое?

ответ

2

Вы правы, за исключением того, что он включает в себя переменные, то есть ошибку, а также исключение в правиле дешифрования по умолчанию, и он действует в любое время, когда актер бросает Throwable. По http://doc.akka.io/docs/akka/2.0/java/fault-tolerance.html#default-supervisor-strategy, по умолчанию, если не определена стратегия супервизор или она не покрывает исключение сброшенного (задано пользователем) Актер, следующие правила не выполняются в порядке, пока один срабатывает:

  1. ActorInitializationException будет остановить неисправный ребенок актер
  2. ActorKilledException остановят неисправному актеру ребенка
  3. других исключений перезагрузятся неисправным актеру ребенка
  4. других типов Throwable будет эскалация родительскому актер

Проверка обзора на http://doc.akka.io/docs/akka/2.3.11/general/supervision.html, если вы еще этого не видели.

Хорошее обсуждение этого вопроса на уровне кода находится в главе 8 «Акка-параллелизма» Дерека Уайта. В основном это относится к версии Scala, но я считаю, что обработка ошибок Actor реализована в Scala (с зависимостями от Java).

Глядя в 2.3.11 источников, актер по умолчанию обработка неисправностей решающая в Акка-actor_2.11-2.3.11-sources.jar \ AKKA \ actor.FaultHandling.scala и:

/** 
    * When supervisorStrategy is not specified for an actor this 
* [[Decider]] is used by default in the supervisor strategy. 
* The child will be stopped when [[akka.actor.ActorInitializationException]], 
* [[akka.actor.ActorKilledException]], or [[akka.actor.DeathPactException]] is 
* thrown. It will be restarted for other `Exception` types. 
* The error is escalated if it's a `Throwable`, i.e. `Error`. 
*/ 
final val defaultDecider: Decider = { 
    case _: ActorInitializationException ⇒ Stop 
    case _: ActorKilledException   ⇒ Stop 
    case _: DeathPactException   ⇒ Stop 
    case _: Exception     ⇒ Restart 
} 

/** 
* When supervisorStrategy is not specified for an actor this 
* is used by default. OneForOneStrategy with decider defined in 
* [[#defaultDecider]]. 
*/ 
final val defaultStrategy: SupervisorStrategy = { 
    OneForOneStrategy()(defaultDecider) 
} 

Это согласуется с документацией - более и менее, поскольку defaultDecider не включает в себя явный

case _ => Escalate // _ is the scala wildcard for anything 

, который реализуется в функциях makeDecider, что по умолчанию нагнетать, если Throwable не соответствует по defaultDecider; и в документации не упоминается включение положения о исключении DeathPactException, вероятно, для уменьшения путаницы с деталями.

Смежные вопросы