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
使用上面的例子,我只能想到没有明确的父子关系的两种后果。
它们是否会产生其他后果?非子消息中继是否可能具有与子消息中继不同的消息排序语义?我不能使用actorSelection访问ParentWithExplictChildren的子actor refs吗?
答案 0 :(得分:2)
你的前两个后果是正确的。你错过了一个,虽然当ParentWithExplicitChildren
失败时,它会停止然后重新开始它的所有孩子,因为它是这些孩子的明确主管。在ParentWithActorRefs
的情况下,此演员的失败不会阻止shamChildren
,因为它不是他们的主管;根守护者是。
此外,是的,您可以通过演员选择访问ParentWithExplicitChildren
参考的孩子。他们是具有可寻址路径的合适演员,因此可以从他们的父母/监督演员的外部进行查询和沟通。