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.
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
@ anindyaju99 Willkommen, froh, dass es geholfen hat. –