2014-11-23 78 views

回答

6

我認爲需要區分演員失敗,正在重新啓動由它的主管和一個演員被明確停止之間進行。如果您有以某種方式獲得的ActorRef(查看並通過ActorSelection解決該問題,或剛剛創建時發生),並且潛在的actor實例失敗並由其主管重新啓動,那麼ActorRef仍然可以正常工作。即使演員技術上在失敗和重新啓動期間停止(將調用postStop),它的名字永遠不會被釋放,並且任何引用它的引用仍然有效。

現在,如果你明確停止的演員,後來開始了一個新的具有相同的名稱(因此相同的路徑),ActorRef s表示稱它預先回採將無法​​正常工作。他們提到的actor實例被停止,因此這些ref是無效的,即使後來一個新的實例以相同的名稱和相同的路徑啓動。

最後,您可以使用ActorSelection來解決上述段落中描述的問題。如果將.actorSelection的結果保留爲ActorSelection,並且不將其解析爲單個ActorRef,則您仍然可以通過它發送消息(ActorSelection支持tell/!)以及由它代表的actor,即使第一個實例最初停止,並在稍後啓動同一名稱的新實例。

0

您可以重用ActorRefs,這就是他們的意思。

http://doc.akka.io/docs/akka/2.3.7/general/addressing.html

+0

該文檔中有些東西讓我懷疑ActorRefs的可重用性。 「當演員被終止時,其參考將指向死信郵箱」。 「演員參考指定一個演員,參考的生命週期與演員的生命週期相匹配」。所以如果一個演員死亡,這聽起來像ActorRef對我不好。如果我每次都打電話給actorSelection,Akka是否會確保我總是能夠獲得對現場演員的參考? – 2014-11-23 22:24:48

+0

不,根本不能保證演員選擇在你請求的路徑上有演員。 – Ryan 2014-11-23 22:42:30

+0

我沒有把我的問題說得很好。如果我有一個ActorRef給已經去世的Actor,那麼我猜猜ActorRef對我來說不再適合我,因爲它基於你鏈接到的參考文檔。或者Akka以某種方式確保Actor的新實例是透明創建的,並且我可以繼續使用ActorRef? – 2014-11-23 22:50:57