处理Akka中的儿童演员例外

时间:2016-02-16 18:49:20

标签: akka

我有一个主管演员,可以创建像这样的儿童演员:

class SupervisorActor extends Actor {

  val child  = context.actorOf(MyConnectorActor.props(config),"MyConnector")

  def receive = {
    case Message => child ! "throw"
  }
}

class MyConnectorActor extends Actor {

  def receive = {
    case "throw" => throw new Exception()
  }
}

现在在我的MyConnectorActor子项中,我会自动抛出异常。 SupervisorActor应该如何处理?我是否需要添加主管策略?

  override val supervisorStrategy =
    OneForOneStrategy(maxNrOfRetries = 30, withinTimeRange = 1.minute) {
      case _ =>
        println("RESTARTING CHILD FROM SUPERVISOR")
        Restart
    }

即使添加了这个,我也看不到我的孩子重演了吗?关于还有什么需要做的任何想法?

1 个答案:

答案 0 :(得分:0)

将一个普通的异常抛出(throw new ...Exception)代替???,因为它比正常的异常造成的伤害更大。

??? actually throws an Error中定义的Predef方法(原文如此!),确切地说是NotImplementedError。并且错误不是由Akka在异常处理代码中使用的NonFatal() extraction处理的。这是因为错误被视为“系统必须现在停止,尽快停止”,而不仅仅是“例外”。

用更真实的东西替换???,比如RuntimeException,你应该看到Actor按预期重新启动。