Akka Actors的异步初始化



我正在尝试找到异步初始化actor的正确模式,以便查找它所需的依赖ActorRef。我想避免使用ActorSelection,因为它是

  • 它指向的参与者数量不明确,以及
  • 有一些开销,这对于许多tell来说是不希望的

从Actor生命周期来看,在消息循环开始之前,它似乎都是同步的,包括preStart等,这让我认为我只有两个选择之一:

使用签名为Future[ActorRef]的工厂方法

构造actor的所有依赖项都是异步解析的,并通过Props传入。

这种方法的主要问题是,你不能使用这个工厂在另一个参与者内部构建一个参与者,因为它也有同样的问题,即它一直是乌龟,异步连接所有参与者的层次结构及其依赖关系。

使用becomestash转换演员

actor是用actorOf创建的,立即生成ActorRef,但它从初始化状态开始,执行依赖项解析,同时stash处理传入消息,最后become处理运行unstashAll

尽管我的依赖项都是var而不是val,但这对参与者来说更为惯用。

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

使用begine:时,您的依赖项没有理由必须是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)不创建参与者。

最新更新