2012-05-11 31 views
5

如果我在Akka中使用context()。actorOf()創建一個actor,我找回一個有效的ActorRef。然而,如果我這樣做,但使用actorFor創建一個ActorRef並且我知道該actor將出現在該路徑中,我不可靠地獲得有效的ActorRef。我怎麼知道演員已經成功註冊?在Akka中,我如何知道在actorOf()註冊後,演員何時可以使用?

在上面的描述中,我可以簡單地使用從actorOf()返回的ActorRef。然而,在我的實際案例中,我創建了一個自己註冊了一個小孩演員的演員,並且我需要解決這個問題,所以一般問題是「我如何等待/註冊以獲知已經在已知路徑中註冊的演員? 」。

回答

1

首先,不能保證你從actorOf獲得的ActorRef仍然存在,因爲它的構造函數可能失敗了。

其次,actorFor可能會找到這個演員,但是在你找到演員之前就已經死了,並且在你開始使用演員之前就已經死了。

第三,構建應用程序通常是一種很好的做法,因此依賴性以邏輯方式傳播,以便在演員之間有一個自然的渲染點。

希望以上任何幫助,

快樂hAkking!

+1

就兩個第一點達成一致意見,演員可能永遠不會在那裏,可能在你有機會使用它之前就離開了。首先,我想我真正想要的是如何正確引導一個基於actor的系統。我應該用一個Start消息來問()一個代表一個子系統的actor,以確保它和它的子系統都準備好了嗎? – SoftMemes

+0

將您的系統創建爲Actor的圖形。然後,您可以使用DeathWatch和系統的eventStream組合來發布活着/死亡。有一個LifeWatch也會很有趣。但風險在於,如果演員永遠不會活着,它會泄漏記憶。 –

+0

當使用akka.testkit時,你發送一條消息給立即實例化的actor ..你需要一種方法來知道它已經準備好了。 – KitAndKat

7

由於阿卡2.2.1可以使用ActorSelection.resolveOne從一個演員的選擇得到ActorRef:

implicit val timeout = Timeout(5, TimeUnit.SECONDS) 
val selection = system.actorSelection("/user/myActor") 
val actor = Await.result(selection.resolveOne(), timeout.duration) 

從文檔http://doc.akka.io/api/akka/2.2.1/index.html#akka.actor.ActorSelection

解決的ActorRef匹配這個選擇。如果存在這樣的演員 ,則結果將返回 作爲未來,並以ActorRef 完成。如果沒有這樣的演員 存在或者在提供的 超時範圍內沒有完成身份驗證,則完成失敗ActorNotFound。

在引擎蓋下,它與演員對話驗證其存在和 獲取其ActorRef。