akka中父母子女关系的后果

时间:2014-04-17 15:05:38

标签: scala akka actor

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

使用上面的例子,我只能想到没有明确的父子关系的两种后果。

  1. Poison Pill不会明确杀死ParentWithActorRefs中包含的actor refs
  2. ParentWithActorRefs的context.children将为空
  3. 它们是否会产生其他后果?非子消息中继是否可能具有与子消息中继不同的消息排序语义?我不能使用actorSelection访问ParentWithExplictChildren的子actor refs吗?

1 个答案:

答案 0 :(得分:2)

你的前两个后果是正确的。你错过了一个,虽然当ParentWithExplicitChildren失败时,它会停止然后重新开始它的所有孩子,因为它是这些孩子的明确主管。在ParentWithActorRefs的情况下,此演员的失败不会阻止shamChildren,因为它不是他们的主管;根守护者是。

此外,是的,您可以通过演员选择访问ParentWithExplicitChildren参考的孩子。他们是具有可寻址路径的合适演员,因此可以从他们的父母/监督演员的外部进行查询和沟通。