我正在和Akka一起玩,我有一个设计,其中一个主管演员有一个孩子扮演角色A和几个孩子扮演角色B.我想定义一个监督政策,如A失败升级(终止主管)而B则生成要重新启动的各个角色。
这可能吗?这是可取的吗?
答案 0 :(得分:7)
是的,覆盖supervisorStrategy
。例如,from the docs:
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
}
然后阅读说明:
如果策略是在监督actor中声明的(而不是在伴随对象中),则其决策者可以以线程安全的方式访问actor的所有内部状态,包括获取对当前失败的子节点的引用(可用)作为失败消息的发送者)。
因此,不是匹配异常的类型,而是匹配发件人(只需在此处键入;它可能无法编译):
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
if (sender == SomeSpecialChild) Escalate
else Restart
}
这没有什么不妥,但是如果你有一群孩子扮演不同的角色,你应该遵循Akka的第一条规则(好吧,我的第一个Akka规则):当有疑问时,你可能想要另一个演员。创建一个角色来监督角色A,另一个角色来监督角色B.你仍然需要覆盖supervisorStrategy
,但测试会更简单。并且管理角色A和B之间的任何其他特殊差异会更容易。