2016-08-05 62 views
0

首先,我對阿卡和演員模型很新,所以也許我做的一切都是錯誤的。不要重新啓動母公司供應商演員重新啓動處理演員

我有一個輸入參與者,它從流源獲取數據並將它們傳遞給具有某種內部狀態的子處理器參與者。輸入參與者可能會在其連接中斷時崩潰,從而觸發其重新啓動。問題是除此之外還會觸發其子項的重新啓動,從而導致它們失去狀態。我不希望這樣,因爲輸入流可能會恢復並且它們的狀態將再次變得相關。此外,處理器是根據輸入中的一些數據產生的,所以我沒有看到在輸入演員之外創建它們的方式。

換句話說,問題是「如何重新啓動參與者流水線的輸入而不重新啓動進一步的階段」?

+0

請看這個答案:http://stackoverflow.com/questions/20528411/prevent-akka-actor-from -restarting-child-actor簡短的回答是:不,你不能重新啓動父主角而不重新啓動他的子主角。 您可以將actor狀態存儲在JVM之外的某處(查看akka持久性)。 – leshkin

回答

1

基本上有3種類型的原因,一個演員重新啓動(1)系統性錯誤,例如發生異常時(2)瞬時錯誤,這是完全你正在處理的東西(連接丟失)和3)腐敗的內部狀態。因爲你有一個父子關係,子女的重啓將會發生。此時Iam不確定您是否可以通過SupervisionStrategy處理它。因此這裏看看http://doc.akka.io/docs/akka/snapshot/general/supervision.html#What_Restarting_Means - 它也是源蔭「援引)

另一種方式來處理你的這種連接可能的容錯處理在這裏,你必須途徑: (1)將連接處理也是錯誤處理(默認),這意味着如果孩子死了只有孩子會重新開始。

(2)你有兩個根Actor,它們是演員系統的演員。一個connectionActor和你的inputActor,你可以將connectionActor的實例傳遞給inputActor,或者反過來從connectionActor請求數據,或者將數據發送給inputActor。

如果你是新來的akka​​演員,這是相當困難的。但我建議閱讀文檔介紹(根據您使用的版本): http://doc.akka.io/docs/akka/snapshot/scala.html