2015-06-21 54 views
0

的Java API在这里。我想了解阿卡演员的监督是如何运作的,特别是监督者的策略。对我来说,战略感觉就像它只是(本质上)异常到指令的映射。关系到孩子

我刚刚读了官方Akka Fault Tolerance documentation,但无处在文档做他们实际上,何时/何/如何监管策略被触发明确规定。

于是我问:当监管策略从事当孩子演员从onReceive方法中抛出Throwable?或者有些不同?

回答

2

你是正确的,除了它包括可抛出,这是错误,以及异常,在默认情况下决胜局规则并将其操作的时候一个演员抛出一个Throwable的。据http://doc.akka.io/docs/akka/2.0/java/fault-tolerance.html#default-supervisor-strategy,默认情况下,如果没有定义主管战略或它不包括由(用户创建的)演员抛出异常,以下规则依次进行,直到一个被触发:

  1. 的ActorInitializationException会阻止失败童星
  2. 的ActorKilledException将停止失败童星
  3. 其他异常将重新启动失败童星
  4. 其他类型的Throwable将被升级到父演员

的监督OK评审是一个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 \阿卡\ 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的规定可能会减少与细节的混淆。

相关问题