2016-11-01 2 views
2

я создаю актер через:Akka: когда это безопасно отправить сообщение

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

или

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

Я обычно блокировать поток вызывающего system.actorOf до сих actorSelection работ. Await.result(system.actorSelection("/user/" + name).resolveOne(), timeout.duration)

мне интересно, если это вообще нужно, или я могу сразу же начать использовать actorRef и отправить (говорят) сообщения в актер/актер бассейна.

Таким образом, вопрос сводится к тому, что если у меня есть actorRef, означает ли это, что почтовый ящик уже создан или может случиться так, что сообщения, отправленные сразу после вызова system.actorOf, могут быть удалены?

ответ

2

Если вы развернете реализацию system.actorOf, вы увидите вызов метода имени makeChild. Внутри этого метода используется длинный метод по признаку ActorRefProvider (внутренне использующий LocalActorRefProvider) под названием actorOf. Этот довольно длительный метод инициализирует дочернего актера. Соответствующие части:

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 явно предусмотрено:

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, почтовый ящик был инициализирован, и вы не должны бояться отправки это сообщения.

Если вы думаете о семантике того, что означает ActorRef, было бы немного бессмысленно предоставить один из ActorRef, который частично/не инициализирован. Это сделало бы системные гарантии слабыми и заставит программиста дважды подумать, прежде чем передавать сообщения, что является противоположным желанием рамки.

+1

Это имеет смысл. Я ожидаю будущее вместо ActorRef, если возврат system.actorOf не будет использоваться немедленно. Благодаря тонну. – anindyaju99

+0

@ anindyaju99 Добро пожаловать, рад, что это помогло. –

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

  • Нет связанных вопросов^_^