sor*_*ega 9 scala actor-model akka akka-supervision
我正在和Akka一起玩,我有一个设计,其中一个主管演员有一个孩子扮演角色A和几个孩子扮演角色B.我想定义一个监督政策,如A失败升级(终止主管)和B生成要重新启动的各个actor.
这可能吗?这是可取的吗?
是的,通过改写supervisorStrategy.例如,来自文档:
import akka.actor.OneForOneStrategy
import akka.actor.SupervisorStrategy._
import scala.concurrent.duration._
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: ArithmeticException => Resume
case _: NullPointerException => Restart
case _: IllegalArgumentException => Stop
case _: Exception => Escalate
}
Run Code Online (Sandbox Code Playgroud)
然后阅读说明:
如果策略是在监督actor内声明的(而不是在伴随对象中),则其决策者可以以线程安全的方式访问actor的所有内部状态,包括获取对当前失败的子级的引用(作为发送者可用)失败的消息).
因此,不是匹配异常的类型,而是匹配发送者(只需在此处键入;它可能无法编译):
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
if (sender == SomeSpecialChild) Escalate
else Restart
}
Run Code Online (Sandbox Code Playgroud)
这没有什么不对,但如果你有一群孩子扮演不同的角色,你应该遵循Akka的第一条规则(好吧,我的第一个Akka规则):当有疑问时,你可能想要另一个演员.创建一个角色来监督角色A,另一个角色来监督角色B.你仍然需要覆盖supervisorStrategy,但测试会更简单.并且更容易管理角色A和B之间的任何其他特殊差异.