2

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

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

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

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

4

1 回答 1

2

ADeathPactException不一定表示编程错误。

故意不处理Terminated消息是当某个演员的任何一个孩子正常停止时停止该演员的所有孩子的一种方式。事件顺序如下:

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

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

于 2018-07-18T10:01:42.800 回答