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에 포함 된 배우 심판을 죽일 것인가? 자식이 아닌 메시지 중계는 하위 메시지 중계와는 다른 메시지 순서 지정 의미를 가질 수 있습니까? actorSelection을 사용하여 ParentWithExplictChildren의 하위 액터 ref에 액세스 할 수 있습니까?
'ParentWithExplicitChildren'에서 노트처럼, 아이들은 항상'context.children'을 통해 접근 할 수 있기 때문에'val children'을 필요로하지 않습니다. 이러한 참조를 유지하기 위해 명시 적으로 'val'이 필요하지 않습니다. – cmbaxter
또한 최상위 "자식"을 만들기 위해 "as"를 닫을 필요가 없습니다. 단지 "context.system"을 사용하십시오. –