Scala 是否有可能在他们的线程之外创建和停止参与者

Scala 是否有可能在他们的线程之外创建和停止参与者,scala,concurrency,akka,Scala,Concurrency,Akka,我想从actor系统外部构建actor层次结构。根据传递的描述动态更改层次结构。Description是一个树,其中包含道具对象。我更喜欢将重新配置actor层次结构的代码与actor类分开。因此,应该在actor线程之外创建并停止actor 简化示例: val system = ActorSystem("example") val actor1 = system.actorOf[prop1, "1"] val actor2 = actor1.context.actorOf[prop2, "2"

我想从actor系统外部构建actor层次结构。根据传递的描述动态更改层次结构。Description是一个树,其中包含
道具
对象。我更喜欢将重新配置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
特性,这应该是不可能的,因为
system.actorOf
返回一个
ActorRef
,它不允许您访问
参与者的内部。由于启动子项需要更改
Actor
的内部状态,因此只能从
Actor
内部执行。我知道
ActorRef
没有
上下文
方法。这就是为什么我写了“我想知道如何从演员身上提取上下文”。可能有一些反射技巧是有用的,这也不会对您有帮助,因为
Actor
可能在完全不同的机器上的JVM之外启动。此外,我认为你希望你的父母监督孩子。然后,它至少应该知道如何处理故障(例如,重新启动子系统,升级错误)。此时,您必须从参与者内部执行一些影响参与者层次结构的逻辑。试图从系统外部生成参与者与Akka的做事方式不兼容。如果你能更清楚地了解你的最终目标,也许有人可以回答如何最好地实现它,而不需要以这种方式启动参与者。我将有一个顶级参与者,我可以将配置数据(道具树)作为消息传递给它,它将负责创建/销毁它下面所需的参与者树。