2016-11-01 5 views
2

를 보낼 때 :Akka : 안전하게 통해 내가 배우를 작성하고 메시지

system.actorOf(Props(....)) 

또는

system.actorOf(SmallestMailboxPool(instances).props(Props(....))). 

나는 보통 system.actorOfactorSelection까지 작품을 호출 스레드를 차단합니다. Await.result(system.actorSelection("/user/" + name).resolveOne(), timeout.duration)

이것이 모두 필요한지 궁금하거나 actorRef을 즉시 사용하고 배우/배우 풀에 메시지를 보냅니다.

actorRef이있는 경우 사서함이 이미 만들어져 있거나 system.actorOf을 호출 한 직후 보낸 메시지가 삭제 될 수 있습니다.

답변

2

system.actorOf의 구현을 드릴 다운하면 메서드 이름 makeChild이 호출됩니다. 내부적으로 이것은 이라고하는 ActorRefProvider 특성 (내부적으로 LocalActorRefProvider을 사용)에서 긴 방법을 사용합니다. 이 다소 긴 메서드는 자식 액터를 초기화합니다. 관련 부분은 다음과 같습니다

val routerDispatcher = system.dispatchers.lookup(p.routerConfig.routerDispatcher) 
val routerMailbox = system.mailboxes.getMailboxType(routerProps, routerDispatcher.configurator.config) 

// routers use context.actorOf() to create the routees, which does not allow us to pass 
// these through, but obtain them here for early verification 
val routeeDispatcher = system.dispatchers.lookup(p.dispatcher) 
val routeeMailbox = system.mailboxes.getMailboxType(routeeProps, routeeDispatcher.configurator.config) 

new RoutedActorRef(system, routerProps, routerDispatcher, routerMailbox, routeeProps, supervisor, path).initialize(async) 

당신이 되돌려 ActorRef 일단, 사서함이 초기화 된 것을 의미하고 전송 두려워해서는 안 :

val props2 = 
    // mailbox and dispatcher defined in deploy should override props 
    (if (lookupDeploy) deployer.lookup(path) else deploy) match { 
    case Some(d) ⇒ 
     (d.dispatcher, d.mailbox) match { 
     case (Deploy.NoDispatcherGiven, Deploy.NoMailboxGiven) ⇒ props 
     case (dsp, Deploy.NoMailboxGiven)      ⇒ props.withDispatcher(dsp) 
     case (Deploy.NoMailboxGiven, mbx)      ⇒ props.withMailbox(mbx) 
     case (dsp, mbx)          ⇒ props.withDispatcher(dsp).withMailbox(mbx) 
     } 
    case _ ⇒ props // no deployment config found 
} 

아니면 Router 경우

명시 적으로 제공 메시지.

ActorRef의 의미에 대해 생각하면 부분적으로/초기화되지 않은 ActorRef을 제공하는 것이 약간 무의미합니다. 그것은 시스템 보증을 약하게 만들 것이고 프로그래머가 메시지를 전달하기 전에 두 번 생각하게 만들 것입니다. 이것은 프레임 워크의 반대쪽 욕망입니다.

+1

그건 의미가 있습니다. system.actorOf의 반환이 즉시 사용 가능하지 않으면 ActorRef 대신 미래가 기대됩니다. 엄청 고마워. – anindyaju99

+0

@ anindyaju99 환영합니다. 도움이 되었기 때문에 기쁩니다. –

관련 문제