斯卡拉 – 当失败时,谁的责任是创造Akka演员的孩子?
Akka的文档正确引用说:
一个误导性的引述说:
我怀疑我们有责任在preStart方法中创建child(ren),因为Akka的术语RESTART不是reSTART,除非你在它们的父preStart()方法中递归地和显式地创建子节点. 示例(使用Akka 2.0& 2.2-SNAPSHOT):无论我尝试什么,孩子总是刚刚停止,从未在此测试用例中重新启动.我创建了Supervisor – >首先 – >第二关系并在主管中抛出异常.发生的事情是主管重新启动并且First&第二次停了. test("restart test") { val system = ActorSystem("test") val supervisor = system.actorOf(Props(new Supervisor),"supervisor") supervisor ! CREATE(Props(new First),"first") Thread.sleep(500) val first = system.actorFor("akka://test/user/supervisor/first") first ! CREATE(Props(new Second),"second") Thread.sleep(500) supervisor ! WTF Thread.sleep(20000) } case object WTF case class CREATE(p: Props,name: String) class Supervisor extends Actor { override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10) { case _: IllegalStateException => Restart case _: IllegalArgumentException => Stop case _: Exception => Restart } override def preStart() { println(s"$self starts") } override def postStop() { println(s"$self stopped") } override def receive = { case WTF => println("throwing exception"); throw new IllegalStateException() case CREATE(p,name) => context.actorOf(p,name) } } class First extends Actor { override def preStart() { println(s"$self starts") } override def postStop() { println(s"$self stopped") } override def receive = { case WTF => println("throwing exception"); throw new IllegalStateException() case CREATE(p,name) } } class Second extends Actor { override def preStart() { println(s"$self starts") } override def postStop() { println(s"$self stopped") } override def receive = { case WTF => println("throwing exception"); throw new IllegalStateException() case CREATE => sender ! "ok" } }
解决方法
你的怀疑是正确的.如果仔细查看
http://doc.akka.io/docs/akka/snapshot/general/supervision.html上重启过程的7步说明,您将看到:
和
因此,您需要覆盖父级的preRestart挂钩以阻止Akka杀死子级,或者覆盖postRestart以重新创建刚刚被杀死的所有子级. 您选择哪个取决于您的应用程序的语义.有时,杀死整个层次结构并以空白板块开始是有用的,有时候不是. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |