【发布时间】:2016-06-22 12:49:08
【问题描述】:
我有两个演员,父母和孩子。父母使用 content.watch(child) 监视孩子。如果孩子调用 context.stop(self),则父母会收到一条 Terminated 消息。但是,如果子进程抛出异常,akka 会重新启动它,但它不会向父进程发送 Terminated 消息。
class Parent ... {
def receive = {
case "start" =>
val child = ...
context.watch(child)
child ! "throw"
case Terminated(actor) => logger.error(s"$actor died"")
}
}
class Child ... {
def receive = {
case "stop" => context.stop(self) // parent is notified
case "throw" => throw new Exception("oops") // parent is not notified
}
}
父actor如何监控子actor并观察任何终止/重启?
我想出的一个选项是覆盖父级中的主管策略以停止任何异常:
class Parent ... {
override val supervisorStrategy = OneForOneStrategy() {
case _: Exception => Stop
}
}
据我了解,这将适用于该演员的所有孩子。理想情况下,我想为个别孩子(演员类型)制定不同的主管策略,所以我想使用
class Child ... {
override def postRestart(reason: Throwable): Unit = context.stop(self)
}
我工作,但它似乎有点像一个黑客。还有其他我不知道的选项吗?
非常感谢!
【问题讨论】:
标签: akka