【问题标题】:Akka: is a DeathPactException always a programming error?Akka:DeathPactException 总是一个编程错误吗?
【发布时间】:2018-07-18 09:23:47
【问题描述】:

我偶尔在我的项目中使用 Akka.NET,所以我知道这项技术,可以用它做一些事情,但不认为自己是专家。

虽然我使用的是 .NET,但这个问题肯定可以由熟悉 JVM 上的 Akka 的人来回答。

最近,我在查看应用程序的日志文件时遇到了DeathPactException。原因是一个演员(演员 A1)观看了另一个演员(A2),它自己开始了。然而,A1 并没有处理 A2 发送的Terminated 消息。这是由于 A2 在执行任务后实际上停止了自己造成的。由于合理定义的主管层次结构等,系统本身工作得很好:A1 只需立即由其主管重新启动。

实际上有没有一个演员会.Watch()另一个演员然后忽略Terminated消息的情况?还是臭名昭著的DeathPactException 基本上总是应用程序代码中的错误,类似于NullReferenceException/NullPointerException

【问题讨论】:

    标签: java .net akka akka.net akka-supervision


    【解决方案1】:

    DeathPactException 不一定表示编程错误。

    故意不处理Terminated 消息是一种在某个actor 的任何一个子进程正常停止时停止该actor 的所有子进程的方法。事件顺序如下:

    1. 演员parent 监视它的所有孩子c1c2c3,但不处理Terminated 消息。
    2. 孩子c2 正常停止。
    3. parent 抛出一个DeathPactException,这会导致parent 重新启动(这是默认的主管策略,可以在parent 的主管/父级中覆盖)。
    4. parentpreRestart 钩子被调用,默认情况下会停止 parent 的所有子节点。

    选择不处理Terminated 消息实际上是一种针对非异常(即,不响应失败)情况制定一站式停止策略的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2017-08-31
      • 1970-01-01
      • 2021-10-15
      • 2012-09-18
      • 2012-03-25
      • 2010-12-22
      相关资源
      最近更新 更多