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中父母子女關係的後果
- 毒丸也不會明確殺死包含在ParentWithActorRefs演員裁判
- ParentWithActorRefs的context.children將是空
他們是其他後果?非子消息中繼可能具有與子消息中繼不同的消息排序語義嗎?我是否可以不通過actorSelection訪問ParentWithExplictChildren的child actor參考?
就像一個說明,在'ParentWithExplicitChildren'中,你不需要'val children',因爲孩子總是可以通過'context.children'訪問。你不需要一個明確的'val'來容納這些refs。 – cmbaxter
也沒有必要關閉「as」來創建頂級「子」,只需使用「context.system」即可。 –