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 context.children
- ParentWithActorRefs будет пустым
ли они другие последствия? Может ли ретрансляция сообщений, отличных от дочерних, иметь другую семантику упорядочения сообщений, чем ретрансляция дочернего сообщения? Могу ли я получить доступ к родительскому актеру ParentWithExplictChildren с помощью actorSelection?
Как и в случае с ParentWithExplicitChildren, вам не нужны «val children», так как дети всегда будут доступны через 'context.children'. Вам не нужен явный 'val' для хранения этих ссылок. – cmbaxter
также нет необходимости закрывать «как» для создания «детей» верхнего уровня, просто используйте «context.system». –