我正在閱讀有關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。
我的問題是我無法弄清楚何時以及爲什麼孩子重新啓動。你能闡明這一點嗎?有沒有我可以參考的主要或源代碼來理解這種行爲?
謝謝。你能否建議我可以在Akka的源代碼中提及有關「重啓策略傳遞給所有升級異常的所有Actor」的信息。「我還沒有找到與此行爲有關的源代碼。 –