2014-04-17 76 views
1
import akka.actor._ 
case object ChildMessage 

implicit val as = ActorSystem() 

class Child extends Actor { 
    def receive = { 
    case ChildMessage => println("I'm a child") 
    } 
} 

class ParentWithExplicitChildren extends Actor { 
    val children = Array.fill(5)(context.actorOf(Props[Child])) 
    def receive = { 
    case ChildMessage => children.foreach(_ ! ChildMessage) 
    case _ => println("I'm a parent") 
    } 
} 

class ParentWithActorRefs extends Actor { 
    val shamChildren = Array.fill(5)(as.actorOf(Props[Child])) 
    def receive = { 
    case ChildMessage => shamChildren.foreach(_ ! ChildMessage) 
    case _ => println("I'm a parent") 
    } 
} 

val parent = as.actorOf(Props[ParentWithExplicitChildren]) 
parent ! ChildMessage 
// Will shut down children 
parent ! PoisonPill 


val shamParent = as.actorOf(Props[ParentWithActorRefs]) 
shamParent ! ChildMessage 
// WONT shut down children 
shamParent ! PoisonPill 

使用上面的示例,我只能想到沒有明確的父子關係的兩個後果。akka中父母子女關係的後果

  1. 毒丸也不會明確殺死包含在ParentWithActorRefs演員裁判
  2. ParentWithActorRefs的context.children將是空

他們是其他後果?非子消息中繼可能具有與子消息中繼不同的消息排序語義嗎?我是否可以不通過actorSelection訪問ParentWithExplictChildren的child actor參考?

+1

就像一個說明,在'ParentWithExplicitChildren'中,你不需要'val children',因爲孩子總是可以通過'context.children'訪問。你不需要一個明確的'val'來容納這些refs。 – cmbaxter

+0

也沒有必要關閉「as」來創建頂級「子」,只需使用「context.system」即可。 –

回答

2

你的前兩個結果是正確的。您錯過了一個,但是當ParentWithExplicitChildren自行失敗時,它會停止,然後重新開始所有的孩子,因爲它是這些孩子的明確主管。在ParentWithActorRefs的情況下,該演員的失敗不會阻止shamChildren,因爲它不是他們的主管;根監護人是。

另外,是的,你可以通過演員選擇訪問ParentWithExplicitChildren裁判的子女。他們是具有可尋址路徑的合適演員,因此可以從他們的父母/監督演員之外查找並與他們進行溝通。