Akka Actors的异步初始化

时间:2015-06-30 20:10:32

标签: scala asynchronous akka

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

  • 对于指向的演员数量不明确,
  • 有一些开销对许多tell s
  • 来说是不可取的

看看Actor LifeCycle它似乎几乎是同步的,直到消息循环开始,包括preStart等,这让我认为我只有两个选择之一:< / p>

使用签名为Future[ActorRef]

的工厂方法

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

这种方法的主要问题是你不能使用这个工厂在另一个actor内构造一个actor,因为它有同样的问题,即它一直是乌龟,连接所有演员的层次结构和他们的异步依赖。

使用becomestash转换演员

使用actorOf创建了actor,立即生成ActorRef,但它以 Initialization 状态启动,是否依赖于解析,stash传入在此期间的消息,最后become 正在运行状态和unstashAll

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

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

1 个答案:

答案 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)未创建演员。