我偶尔会在我的项目中使用 Akka.NET,所以我知道这项技术,可以用它做一些事情,但不认为自己是专家。虽然我使用 .NET,但熟悉 JVM 上 Akka 的人肯定可以回答这个问题。最近,我偶然看到了DeathPactException一个应用程序的日志文件。原因是一个演员(演员 A1)观看了另一个演员(A2),这是它自己开始的。但是,A1 没有处理TerminatedA2 发送的消息。这是由于 A2 在执行其任务后实际上停止了自己造成的。多亏了合理定义的主管层次结构等,系统本身运行得很好:A1 被它的主管立即重新启动。实际上是否有任何场景,一个演员会.Watch()另一个演员,然后忽略该Terminated消息?或者臭名昭著的DeathPactException基本上总是应用程序代码中的错误,类似于NullReferenceException/ NullPointerException?
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
ADeathPactException
不一定表示编程错误。
故意不处理Terminated
消息是一种在该演员的任何一个孩子正常停止时停止所有该演员的孩子的方法。事件顺序如下:
Actor
parent
监视其所有子代 、c1
、c2
和c3
,但不处理Terminated
消息。孩子
c2
正常停止。parent
抛出 aDeathPactException
,这会导致parent
重新启动(这是默认的主管策略,可以在parent
的主管/父级中覆盖)。parent
的preRestart
钩子被调用,默认情况下会停止所有parent
的孩子。
选择不处理Terminated
消息实际上是为非异常(即,不响应故障)情况制定全面停止策略的一种手段。
添加回答
举报
0/150
提交
取消