我通过以下方式创建演员:
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
后立即发送的邮件可能会被删除?
答案 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
的语义将是毫无意义的。它会使系统保证变弱,并且会使程序员在传递消息之前三思而后行,这是框架的相反愿望。