2015-10-25 36 views
2

我正在使用scala akka actor模型。我有一位父母演員創建n個孩子演員。兒童演員首先彼此交談,然後向主演員報告答案。但是我無法爲報告部分工作。代碼結構如下:如何在scala akka中找到父母演員

class Master(n:Int) extends Actor{ 
    val system =ActorSystem("mysystem") 
    for(i <- 1 to n){ 
     val child=system.actorOf(Props(new Node),name=i.toString) 
    } 
    ... code let child actor talk with each other ... 
    def receive={ 
     case _=>"received" 
    } 
} 
class Node extends Actor{ 
    def receive={ 
     case => ... some code talking with each other... 
       var master=context.actorSelection("../Master") 
       master ! "talk back to master" 
    } 
} 
def main() { 
    val Master=system.actorOf(Props(new Master(10)),name="Master") 
} 
+2

此行:'val child = system.actorOf(Props(new Node),name = i.toString)'應該是'val child = context.actorOf(Props(new Node),name = i.toString)' –

回答

0

嘗試

val master = context.actorSelection("/user/Master") 
master ! "talk back to master" 

您可能還需要採取的文檔中看看this entry

+0

試過。似乎沒有工作。@ christophetd –

+0

另一種解決方案是使用發件人參考來回答主人: 發件人! 「回覆主人」 – christophetd

+0

這種方法不適合我,因爲這裏的發件人將是其他子節點而不是主節點。 @christophetd –

3

是否讓主人將其自我引用傳遞給節點。相關的更改行是:

... // In Master: 
val child=context.actorOf(Props(new Node(self)),name=i.toString) 
... 
... // Definition of Node: 
class Node(master: ActorRef) extends Actor{ 
... 
//var master=context.actorSelection("../Master") - this line no longer required. 
... //etc. 
+0

編輯 - 根據@ViktorKlang和@Archeg的評論/回答改變'system.actorOf'調用'context.actorOf'。趕上好球員,我錯過了。 – Shadowlands

1

是否有任何理由爲什麼要創建新的ActorSystem?通常它只創建一次,但你已經有一個演員,這意味着你已經擁有一個系統,不需要創建兩次。 ActorSystem非常重量級,它分配線程,讀取調度程序的配置,遠程功能,地址等。除非有很好的理由這麼做,否則不應該創建一個新的。

我建議刪除創建ActorSystem,創建子actor時使用context而不是system。有了這個,你可以在你的Node中使用context.parent來得到Master,因爲它是你所有孩子的主管。

此外,查詢../Master選擇一個兄弟而不是父母。您可能想要..,其結果與context.parent完全一樣,但context.parent應該更快