Akka Actors的异步初始化

Arn*_*sen 9 asynchronous scala akka

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

  • 关于它指向的演员数量的模糊不清,以及
  • 有一些开销对许多人来说是不可取tell

看看Actor LifeCycle看起来几乎是同步的,直到消息循环开始,包括preStart等等,这让我觉得我只有两个选择之一:

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

构造actor的所有依赖项都是异步解析并通过via传递的Props.

这种方法的主要问题是你不能使用这个工厂在另一个actor内部构造一个actor,因为它有同样的问题,即它一直是乌龟,所有actor的层次结构及其异步连接.

使用becomestash转换演员

使用actorOf,立即生成一个actor ,ActorRef但它以初始化状态启动,执行依赖解析,stash同时传入消息,最后become执行运行状态和unstashAlling.

对于演员而言,这感觉更加惯用,即使我的所有依赖都将var取而代之val.

两者似乎都有很多开销,让我想知道我是否是最好的选择,或者我是否在文档中找不到合适的模式.

Rya*_*yan 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
Run Code Online (Sandbox Code Playgroud)

此外,actorFor是a)弃用和b)不创建演员.