2017-03-16 38 views
1

我正在閱讀有關akka容錯性的教程http://doc.akka.io/docs/akka/current/scala/fault-tolerance.html。文章末尾的代碼片段和文本顯示,如果Supervisor中的Exception SupervisorStrategy是Esclate,那麼Supervisor將忽略其子級中拋出的Exception給其主管,導致Supervisor重新啓動並停止其所有子級。我可以將「停止所有的孩子」操作鏈接到來自Akka源代碼的Actor.scala的源代碼並理解這種行爲。爲什麼主管在重寫主管的preRestart掛鉤後要重新啓動其子項,以避免在akka中停止其子項?

def preRestart(reason: Throwable, message: Option[Any]): Unit = { 
    context.children foreach { child ⇒ 
     context.unwatch(child) 
     context.stop(child) 
    } 
    postStop() 
    } 

的製品然後介紹Supervisor2而不同監在於添加了一個preRestart方法沒有操作。然後Supervisor2的孩子會在Exception的情況下生存下來,因爲Supervisor2在preRestart鉤子中沒有做任何事情,而不是迭代子節點並停止它們中的每一個。但是,下面的代碼顯示,孩子們重新開始並失去其狀態。

child3 ! new Exception("CRASH") 
child3 ! "get" 
expectMsg(0) // lose its state 

我在我的IDE中使用斷點來確認孩子的重新啓動確實存在,併爲孩子調用preRestart。

我的問題是我無法弄清楚何時以及爲什麼孩子重新啓動。你能闡明這一點嗎?有沒有我可以參考的主要或源代碼來理解這種行爲?

回答

1

孩子被重新啓動,因爲這是Exception得到Escalate d過去Supervisor2後用戶監護人的默認監督策略。 Restart戰略被傳遞到所有Actor s Escalate d Exception

如果Supervisor2沒有被覆蓋preRestart,子女Actor將被停止,根本不存在。

您似乎尋找的行爲只有在Supervisor2的主管使用Resume策略處理Exception時纔會發生。

+0

謝謝。你能否建議我可以在Akka的源代碼中提及有關「重啓策略傳遞給所有升級異常的所有Actor」的信息。「我還沒有找到與此行爲有關的源代碼。 –

相關問題