2015-06-30 93 views
9

我试图找到正确初始化actor的模式,以便我可以查找它需要的相关ActorRef。我想避免使用ActorSelection,因为它是Akka Actor的异步初始化

  • 模棱两可所指向演员的数量,并
  • 具有一些开销,这是不可取的许多tell小号

纵观Actor LifeCycle它似乎几乎是同步的,直到消息循环开始,包括preStart等,这导致我认为我只有以下两种选择中的一种:

使用工厂方法的Future[ActorRef]

所有依赖的签名构建演员是异步解决,通过Props传递英寸

这种方法的主要问题是,你不能使用这个工厂在另一个actor中构造一个actor,因为它有相同的问题,也就是说,它一直是乌龟,连接所有actor的层次结构,它们的依赖性是异步的。

使用becomestash转型演员

演员与actorOf创建,立即产生一个ActorRef但在初始化状态开始,做它的解决依赖,stash荷兰国际集团在收到的消息同时,最后还有运行状态和unstashAll ing。

对于演员来说,这种感觉更具惯用,即使我的依赖关系都是var而不是val

两者似乎都有很大的开销,这让我想知道这些是最好的选择还是我没有在文档中找到正确的模式。

回答

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是)弃用,b)不创建一个演员。

+0

编辑我的使用'actorFor',这是一个错字。 “成为”当然看起来是最好的方法。仍然不能相信没有异步版本的'Props'食谱 –

+0

我已经创建了一个基于'become' /'stash'的初始化阶段的特征,其中包含您对不可变运行状态的建议:https://gist.github。 COM/sdether/15bc96e27ed965bd89c3 –