【问题标题】:Handling Child Actor Exceptions in Akka在 Akka 中处理子 Actor 异常
【发布时间】:2016-05-28 05:06:43
【问题描述】:

我有一个主管 Actor,它可以像这样创建子 Actor:

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
    }

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

【问题讨论】:

    标签: akka


    【解决方案1】:

    用普通异常抛出 (throw new ...Exception) 代替 ???,因为它比普通异常造成的危害更大。

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

    ??? 替换为更真实的内容,例如 RuntimeException,您应该会看到 Actor 按预期重新启动。

    【讨论】:

    • 异常实际上是在孩子身上引发的,我希望这个主管对该异常做出反应并重新启动孩子。我编辑了我的帖子!请看一看!
    • 它无论如何都会重新启动,因为这是默认行为。您的代码应该使用 OneForOneStrategy 覆盖父级中的监督策略,而不仅仅是在某处定义一对一。阅读 akka 文档中的详细信息
    • 如果我可以问,您如何观察到没有重启?
    • 我的孩子有一个 preRestart,我发现它永远不会被调用!
    • 好吧,这是我的错!有一个陈旧的 jar 文件,我用 sbt clean 清除它,然后重新运行我的应用程序,我可以看到孩子重新启动。但是我如何让它做它在异常之前最初启动时所做的初始化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2014-05-31
    相关资源
    最近更新 更多