的Java API在这里。我想了解阿卡演员的监督是如何运作的,特别是监督者的策略。对我来说,战略感觉就像它只是(本质上)异常到指令的映射。关系到孩子
我刚刚读了官方Akka Fault Tolerance documentation,但无处在文档做他们实际上,何时/何/如何监管策略被触发明确规定。
于是我问:当监管策略从事?当孩子演员从onReceive
方法中抛出Throwable
?或者有些不同?
的Java API在这里。我想了解阿卡演员的监督是如何运作的,特别是监督者的策略。对我来说,战略感觉就像它只是(本质上)异常到指令的映射。关系到孩子
我刚刚读了官方Akka Fault Tolerance documentation,但无处在文档做他们实际上,何时/何/如何监管策略被触发明确规定。
于是我问:当监管策略从事?当孩子演员从onReceive
方法中抛出Throwable
?或者有些不同?
你是正确的,除了它包括可抛出,这是错误,以及异常,在默认情况下决胜局规则并将其操作的时候一个演员抛出一个Throwable的。据http://doc.akka.io/docs/akka/2.0/java/fault-tolerance.html#default-supervisor-strategy,默认情况下,如果没有定义主管战略或它不包括由(用户创建的)演员抛出异常,以下规则依次进行,直到一个被触发:
的监督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的规定可能会减少与细节的混淆。