是否可以在其线程之外创建和停止actor

时间:2015-08-28 08:30:05

标签: scala concurrency akka

我想从演员系统外部构建actor层次结构。根据传递的描述动态更改层次结构。描述是一个包含Props个对象的树。我更喜欢将从actor类重新配置actor层次结构的代码分开。因此,应该在actor线程之外创建并停止actor。

简化示例:

val system = ActorSystem("example")
val actor1 = system.actorOf[prop1, "1"]
val actor2 = actor1.context.actorOf[prop2, "2"]

我想知道如何从演员中提取上下文。即使我提供了适当的方法,上下文也被认为只在actor内有效。我想避免创建将产卵儿童委托给外面的混合体。

我写了一个关于如何实现提取器上下文暴露的简单演示。

trait Holder {
  var factory : Option[ActorRefFactory] = None
  val factoryLock = new Object
  val props : Props // oftype ExposedActor, but Props lacks type parametrization
  val parent : Holder

  def create(props : Props, name : String) : ActorRef =
    factoryLock synchronized {
      factory.map( _.actorOf(props, name) ).get
    }
  val actorRef = parent.create(props, "ugly")
}

trait ExposedActor extends Actor {
  val holder : Holder
  override def preStart() {
    super.preStart()
    holder.factoryLock.synchronized {
      holder.factory = Some(context)
    }
  }
}

但是有一个缺点:我需要在所有演员中混合ExposedActor特征

0 个答案:

没有答案