3

我有以下代码:

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 }
}

self ! Kill演员实例中,A我没有看到“演员已被杀死”的消息,随后对演员的调用会A生成“死信”消息,因此没有重新启动。为什么是OneForOneStrategy不被调用?

奇怪的是,我可以删除整个OneForOneStrategy覆盖并且程序行为没有任何变化。

4

2 回答 2

7

val b = context.system.actorOf(Props[B], "b")应该改为val b = context.actorOf(Props[B], "b")让新演员成为孩子,而不是顶级演员。

于 2014-03-27T23:18:00.510 回答
3

您同时重新启动演员“B”,然后在重新启动时抛出异常。self ! true从您的postRestart代码中删除。否则,你期望会发生什么?您将其发送到无限递归的重启循环中。

这是您看到的顺序或动作来说明它:

  1. 创建演员“A”
  2. 创建演员“B”
  3. 发送true给 A
  4. 发送true给 B
  5. “B”在true消息中引发异常
  6. “A”重新启动“B”
  7. 重启后“B”发送自己true
  8. 重复步骤 5
于 2014-03-27T14:54:35.260 回答