2014-04-17 7 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 context.children
  2. ParentWithActorRefs будет пустым

ли они другие последствия? Может ли ретрансляция сообщений, отличных от дочерних, иметь другую семантику упорядочения сообщений, чем ретрансляция дочернего сообщения? Могу ли я получить доступ к родительскому актеру ParentWithExplictChildren с помощью actorSelection?

+1

Как и в случае с ParentWithExplicitChildren, вам не нужны «val children», так как дети всегда будут доступны через 'context.children'. Вам не нужен явный 'val' для хранения этих ссылок. – cmbaxter

+0

также нет необходимости закрывать «как» для создания «детей» верхнего уровня, просто используйте «context.system». –

ответ

2

Ваши первые два следствия верны. Вы пропустили один из них, хотя в том, что когда ParentWithExplicitChildren сбой сам, он остановится, а затем снова запустит все его дети, потому что это явный супервизор для этих детей. В случае ParentWithActorRefs отказ в этом акторе не остановит shamChildren, поскольку он не является их руководителем; корневой хранитель.

Кроме того, да, вы можете получить доступ к детям из ParentWithExplicitChildren refs через выбор актера. Они являются надлежащими участниками с адресными путями и, таким образом, могут быть просмотрены и переданы из-за пределов их родительского/контролирующего актера.

Смежные вопросы