Akka OneForOneStrategy不起作用

时间:2014-03-27 14:48:52

标签: scala akka actor fault-tolerance

我有以下代码:

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覆盖,并且程序行为没有任何变化。

2 个答案:

答案 0 :(得分:6)

val b = context.system.actorOf(Props[B], "b")应更改为val b = context.actorOf(Props[B], "b"),以使新演员成为儿童,而不是顶级演员。

答案 1 :(得分:3)

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

以下是您要说明的顺序或操作:

  1. 创建演员“A”
  2. 创建演员“B”
  3. true发送给A
  4. true发送给B
  5. “B”在true消息
  6. 处抛出异常
  7. “A”重启“B”
  8. 重新启动后“B”自行发送true
  9. 重复步骤5