Akka:什么时候发送消息是安全的

时间:2016-11-01 06:58:59

标签: scala 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后立即发送的邮件可能会被删除?

1 个答案:

答案 0 :(得分:2)

如果您深入了解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 } 的冗长方法。这个相当冗长的方法初始化了子actor。相关部分是:

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所代表的语义,那么提供一个部分/未初始化SELECT DISTINCT DB_NAME(dovs.database_id) DBName, mf.physical_name PhysicalFileLocation, dovs.logical_volume_name AS LogicalName, dovs.volume_mount_point AS Drive, CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB FROM sys.master_files mf CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs ORDER BY FreeSpaceInMB ASC GO 的语义将是毫无意义的。它会使系统保证变弱,并且会使程序员在传递消息之前三思而后行,这是框架的相反愿望。