Akka:DeathPactException 总是编程错误吗?

Akka: is a DeathPactException always a programming error?

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

虽然我用的是.NET,但是熟悉JVM上Akka的人肯定能回答这个问题

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

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

DeathPactException 不一定表示编程错误。

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

  1. Actor parent 监视其所有 children、c1c2c3,但不处理 Terminated留言。
  2. Child c2 正常停止。
  3. parent抛出一个DeathPactException,导致parent重启(这是默认的supervisor策略,可以在parent的supervisor/parent).
  4. parentpreRestart 挂钩被调用,默认情况下会停止所有 parent 的 children.

选择不处理 Terminated 消息实际上是一种为 non-exceptional(即不响应失败)情况制定 all-for-one 停止策略的方法。