我寫過一些actor類,我發現我必須處理這些實體的生命週期。例如,當我的actor初始化時,我想調用一個方法,這樣我就可以在消息隊列中設置一些偵聽器(或打開數據庫連接等)。Akka相當於Spring InitializingBean
這是否與此相當?相當於我能想到的是Spring的InitialisingBean和DisposableBean
我寫過一些actor類,我發現我必須處理這些實體的生命週期。例如,當我的actor初始化時,我想調用一個方法,這樣我就可以在消息隊列中設置一些偵聽器(或打開數據庫連接等)。Akka相當於Spring InitializingBean
這是否與此相當?相當於我能想到的是Spring的InitialisingBean和DisposableBean
這是一個典型的場景,你會喜歡override methodspreStart()
,postStop()
,等我看不出什麼錯。
當然,您必須瞭解詳細信息 - 例如postStop()
在調用actor.stop()
後異步調用,而preStart()
在調用Actor時調用。這意味着可能會緩慢/阻止諸如數據庫交互的操作應儘量少。
您還可以使用Actor的構造函數來初始化數據。
正如馬修所說,監督在阿卡中扮演着重要角色 - 所以你可以指導主管在事件上執行特定的事情。例如,所謂的DeathWatch - 你可以當演員「您正在觀看在」一模通知:
context.watch(child)
...
def receive = {
case Terminated(`child`) => lastSender ! "finished"
}
由於其生命週期(它比清理資源的最終化方法更可靠),postStop可能是一個有價值的回調函數。 preStart,在實例化之後被actor系統直接調用,具有與構造函數基本相同的生命週期。 –
是的,但還有一點。在'postRestart'的默認實現中''preStart'被調用 - 所以也可以覆蓋'postRestart',然後跳過第二次調用'preStart'或者在某些情況下調用它。但這真是一個極端的例子。 – Anton
我希望看到改進的設計:)。但那很酷 –
一個Actor基本上是兩個方法 - 一個構造函數和onMessage(Object): void
。
它的生命週期中沒有任何東西自然地提供了「佈線」行爲,這爲您留下了幾個選擇。
使用監事演員來創建其他演員。監督員負責監視,啓動和重新啓動參與者失敗 - 因此,讓監督人員瞭解集成系統的狀態以避免持續重新啓動通常很有價值。該主管將創建和管理服務對象(可能通過Spring)並將它們傳遞給Actor。
在Actor構建時使用您的首選初始化技術。這是棘手的,但你可以肯定結合春天與演員。要知道,如果一個主管重新啓動你的角色,你需要能夠從你放置在Props對象中的任何內容中恢復它所需的狀態,這個對象是你用來啓動它的第一個地方。
根據需要配線一切。 Actor啓動時按需打開連接(並根據需要緩存)。我發現我經常這麼做 - 當連接不再工作時,我讓演員失敗。主管將重新啓動Actor,它將重新創建所有連接。
一些很重要的事情要記住:
我看到像啓動前()等方法,但我似乎並沒有得到回調這些方法。 –