如果我有一個演員向另一個演員發送消息,我應該每次向該演員發送一條消息時獲得對該演員的引用(例如context.actorSelection(somePath)
),或者我可以在演員初始化時執行一次演示重複使用ActorRef
?在Akka中,我可以在實例字段中保存ActorRef嗎?
2
A
回答
6
我認爲需要區分演員失敗,正在重新啓動由它的主管和一個演員被明確停止之間進行。如果您有以某種方式獲得的ActorRef
(查看並通過ActorSelection
解決該問題,或剛剛創建時發生),並且潛在的actor實例失敗並由其主管重新啓動,那麼ActorRef
仍然可以正常工作。即使演員技術上在失敗和重新啓動期間停止(將調用postStop
),它的名字永遠不會被釋放,並且任何引用它的引用仍然有效。
現在,如果你明確停止的演員,後來開始了一個新的具有相同的名稱(因此相同的路徑),ActorRef
s表示稱它預先回採將無法正常工作。他們提到的actor實例被停止,因此這些ref是無效的,即使後來一個新的實例以相同的名稱和相同的路徑啓動。
最後,您可以使用ActorSelection
來解決上述段落中描述的問題。如果將.actorSelection
的結果保留爲ActorSelection
,並且不將其解析爲單個ActorRef
,則您仍然可以通過它發送消息(ActorSelection
支持tell/!
)以及由它代表的actor,即使第一個實例最初停止,並在稍後啓動同一名稱的新實例。
0
您可以重用ActorRefs,這就是他們的意思。
該文檔中有些東西讓我懷疑ActorRefs的可重用性。 「當演員被終止時,其參考將指向死信郵箱」。 「演員參考指定一個演員,參考的生命週期與演員的生命週期相匹配」。所以如果一個演員死亡,這聽起來像ActorRef對我不好。如果我每次都打電話給actorSelection,Akka是否會確保我總是能夠獲得對現場演員的參考? – 2014-11-23 22:24:48
不,根本不能保證演員選擇在你請求的路徑上有演員。 – Ryan 2014-11-23 22:42:30
我沒有把我的問題說得很好。如果我有一個ActorRef給已經去世的Actor,那麼我猜猜ActorRef對我來說不再適合我,因爲它基於你鏈接到的參考文檔。或者Akka以某種方式確保Actor的新實例是透明創建的,並且我可以繼續使用ActorRef? – 2014-11-23 22:50:57