我试图找到适当的模式来异步初始化一个actor,以便我可以查找ActorRef
它所需的从属对象。我想避免使用ActorSelection
,因为它是
tell
小号观察Actor LifeCycle,直到消息循环开始为止几乎都是同步的,包括preStart
等,这使我认为我只有以下两种选择之一:
使用签名为的工厂方法 Future[ActorRef]
构造actor的所有依赖关系均以异步方式解析并通过传入Props
。
这种方法的主要问题是,您不能使用该工厂在另一个actor内构造一个actor,因为它存在相同的问题,即,它一直处于乌龟状态,异步连接所有actor的层次结构及其依赖关系。
使用become
和stash
转换演员
使用来创建actor actorOf
,立即导致,ActorRef
但它以Initialization状态开始,执行依赖关系解析,同时stash
处理传入的消息,最后become
进入Running状态并unstashAll
ing。
即使我的依赖关系全部是var
而不是,这对于演员来说还是很惯用的val
。
两者似乎都非常麻烦,这让我想知道这是最好的选择还是只是我在文档中找不到合适的模式。
vars
使用成为时没有理由必须依赖您:
val initializing: Actor.Receive = {
case Dependencies(d1, d2) => context.become(working(d1, d2))
}
def working(d1: Dependency, d2: Dependency): Actor.Receive = {
case msg => d1.fetch(...) // whatever
}
def receive = initializing
此外,actorFor
a)已弃用,b)未创建演员。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句