2013-08-19 136 views
1

如果這是一個重複的問題,請道歉。Akka:從一名演員轉發到另一名演員

我是AKKA的新手,並試圖擴展akka-java-spring示例代碼以添加另一個actor並擁有一個不可變對象Counter用作要發送給CoutingActor的消息,該消息打印消息並將其轉發給一個PrintMessageActor(新演員)。如何將消息從CoutingActor轉發給PrintMessageActor。在這種情況下,如何使用文檔中的以下片段來使用它。

target.forward(result, getContext()); 

如何獲得第一個演員的目標(第二個演員)?

回答

1

如果我正確理解你的問題,你想知道轉發角色從哪裏知道它應該轉發的目標?

兩種可能性:

1)如果在轉發演員得到體現目標的演員已經存在,那麼你可以簡單地傳遞它通過構造函數或在消息目標的ActorRef。有關如何使用自己的參數創建自定義Props實例,請參閱Props文檔。 2)如果目標在創建轉發器時不存在,但其在ActorSystem中的路徑已經清除(例如「/ user/PrintMessageActor」),則可以傳遞ActorSelection。如果此路徑中的Actor存在於給定的ActorSystem中,則ActorSelection可以解析爲ActorRef。優選的是第二個選項,因爲如果底層角色死亡,ActorRef將是無效的。另一方面,ActorSelection將解析爲此路徑上Actor可能的新的化身。

+0

謝謝比約恩。我會嘗試使用第二個選項。我也想爲CoutingActor和PrintMessageActor創建子actor。在父母角色中如何創建子動作者以及子角色如何處理消息? 我想要做的是 - 傳遞消息給CoutingActor - 這個actor的孩子打印一條消息,然後消息被傳遞給PrintMessageActor - 它有孩子,他們打印一條消息。我也想控制父母演員可以擁有的兒童人數。如果您能指出我朝着正確的方向,我將不勝感激。 – Sachin

+0

Hallo Sachin。您可以根據需要創建儘可能多的兒童演員。創建一級演員和小孩演員之間唯一的區別就是爲您創作的對象。如果你想創建一個第一級的actor(比如「/ user/MyActor」),那麼你直接使用ActorSystem,比如說ActorRef的system.actorOf(...)或者ActorSelection的system.actorSelection(...) 。可以使用ActorContext從Actor中創建子actor。 (context.actorOf/.actorSelection) –

+0

(續)發送所有孩子相同的消息(廣播)可以通過兩種方式實現。您可以迭代父代actor的「children」屬性,向他們發送所有相同的消息 - 或者使用稱爲Router的特殊類型的中介actor。該路由器有幾種不同的實現方式,一種是適合您需求的BroadcastRouter。但在這樣一個簡單的情況下,我個人更喜歡只是迭代孩子。 –