2016-11-01 6 views
2

ich ein Schauspieler über erschaffe:Akka: wenn es sicher ist, eine Nachricht zu senden

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

oder

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

ich in der Regel den Faden Block system.actorOf bis actorSelection Werken aufrufen. Await.result(system.actorSelection("/user/" + name).resolveOne(), timeout.duration)

Ich frage mich, ob dies überhaupt nicht oder ich sofort kann die actorRef Verwendung benötigt wird, starten und (sagen) Nachrichten an den Schauspieler/Schauspieler Pool senden.

Also läuft die Frage auf, wenn ich eine actorRef habe, bedeutet das, dass die Mailbox bereits erstellt ist oder es könnte passieren, dass die Nachrichten, die ich sofort nach dem Aufruf system.actorOf gesendet habe, fallen gelassen werden?

Antwort

2

Wenn Sie die Implementierung von system.actorOf aufschlüsseln, sehen Sie einen Aufruf der Methodennamen makeChild. Intern verwendet dies eine langwierige Methode für das Merkmal ActorRefProvider (intern LocalActorRefProvider) actorOf genannt. Diese ziemlich lange Methode initialisiert den Kindschauspieler. Relevante Teile sind:

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 
} 

Oder wenn ein Router ist ausdrücklich vorgesehen:

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) 

Was bedeutet, dass, sobald Sie ein ActorRef zurück, hat sich die Mailbox initialisiert wurde und Sie sollten nicht senden Angst es Nachrichten.

Wenn Sie über die Semantik dessen denken, was ein ActorRef ist, wäre es ein wenig sinnlos, einen mit einem ActorRef zu liefern, der teilweise/nicht initialisiert ist. Es würde Systemgarantien schwach machen und würde den Programmierer dazu bringen, zweimal nachzudenken, bevor er Nachrichten weitergibt, was der entgegengesetzte Wunsch des Frameworks ist.

+1

Das macht Sinn. Ich würde eine Zukunft anstelle von ActorRef erwarten, wenn die Rückgabe von system.actorOf nicht sofort nutzbar ist. Danke vielmals. – anindyaju99

+0

@ anindyaju99 Willkommen, froh, dass es geholfen hat. –

Verwandte Themen