我正在尝试找到用于异步初始化actor的正确模式,以便我可以查找它所需的依赖ActorRef
。我想避免使用ActorSelection
,因为它是
tell
s 看看Actor LifeCycle它似乎几乎是同步的,直到消息循环开始,包括preStart
等,这让我认为我只有两个选择之一:< / p>
使用签名为Future[ActorRef]
构造actor的所有依赖项都是异步解析的,并通过Props
传递。
这种方法的主要问题是你不能使用这个工厂在另一个actor内构造一个actor,因为它有同样的问题,即它一直是乌龟,连接所有演员的层次结构和他们的异步依赖。
使用become
和stash
转换演员
使用actorOf
创建了actor,立即生成ActorRef
,但它以 Initialization 状态启动,是否依赖于解析,stash
传入在此期间的消息,最后become
正在运行状态和unstashAll
。
对于演员来说,这感觉更加惯用,即使我的依赖关系都是var
而不是val
。
两者似乎都有很多开销,让我想知道我是不是最好的选择,或者我是否在文档中找不到合适的模式。
答案 0 :(得分:7)
使用“成为:
”时,您的依赖关系没有理由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)未创建演员。