我偶爾會在我的項目中使用 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
提交
取消