我有以下代码:
class A extends Actor with ActorLogging {
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 2) {
case _ => log.info("An actor has been killed"); Restart
}
val b = context.system.actorOf(Props[B], "b")
def receive = {
case _ => context.system.scheduler.schedule(5 seconds, 5 seconds, b, true)
}
}
class B extends Actor with ActorLogging {
def receive = { case true => self ! Kill }
}
在演员{{1}}的实例中self ! Kill
之后我没有看到消息"演员被杀了#34;随后对演员A
的调用会生成"死信"消息所以没有重启。为什么A
没有被调用?
奇怪的是我可以删除整个OneForOneStrategy
覆盖,并且程序行为没有任何变化。
答案 0 :(得分:6)
val b = context.system.actorOf(Props[B], "b")
应更改为val b = context.actorOf(Props[B], "b")
,以使新演员成为儿童,而不是顶级演员。
答案 1 :(得分:3)
您正在同时重新启动actor“B”,然后在重新启动时抛出异常。从self ! true
代码中删除postRestart
。否则,你期望发生什么?你将它发送到一个无限递归的重启循环。
以下是您要说明的顺序或操作:
true
发送给A true
发送给B true
消息true