我有一个主管演员,可以创建像这样的儿童演员:
class SupervisorActor extends Actor {
val child = context.actorOf(MyConnectorActor.props(config),"MyConnector")
def receive = {
case Message => child ! "throw"
}
}
class MyConnectorActor extends Actor {
def receive = {
case "throw" => throw new Exception()
}
}
现在在我的MyConnectorActor子项中,我会自动抛出异常。 SupervisorActor应该如何处理?我是否需要添加主管策略?
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 30, withinTimeRange = 1.minute) {
case _ =>
println("RESTARTING CHILD FROM SUPERVISOR")
Restart
}
即使添加了这个,我也看不到我的孩子重演了吗?关于还有什么需要做的任何想法?
答案 0 :(得分:0)
将一个普通的异常抛出(throw new ...Exception
)代替???
,因为它比正常的异常造成的伤害更大。
???
actually throws an Error
中定义的Predef
方法(原文如此!),确切地说是NotImplementedError。并且错误不是由Akka在异常处理代码中使用的NonFatal()
extraction处理的。这是因为错误被视为“系统必须现在停止,尽快停止”,而不仅仅是“例外”。
用更真实的东西替换???
,比如RuntimeException,你应该看到Actor按预期重新启动。