1

我正在使用 Play 的 Actor 系统为我的应用程序创建我的主管(根)actor。

我需要对这个根 Actor 做的第一件事是向它发送一条消息来配置它自己和一堆子 Actor。配置涉及使用 TypeSafe 配置 API 从 conf 文件中读取,然后将这些值加载到数据库(在本例中为 MongoDB)。由于我使用 reactivemongo 将配置从 conf 文件加载到数据库,因此它是完全非阻塞和异步的。控制器中的所有其他操作取决于加载到数据库的配置值。

我不清楚我应该在哪里创建这个演员?我尝试在我的控制器的构造函数中创建它,但是如果在异步加载完成之前调用了一个动作,我会得到一个异常。

我也尝试将它放在 Global.onStart() 中,但我又无法让主管进入我的控制器代码。

import play.api._

object Global extends GlobalSettings {


  override def onStart(app: Application) {
    Logger.info("Application has started")
  val supervisor = Akka.system().actorOf(Props(new Supervisor()), "easupervisor")

  }


}

我尝试直接在 Global 对象的构造函数中创建主管,但这也给了我一个播放初始化错误。

object Global extends GlobalSettings {

  val supervisor = Akka.system().actorOf(Props(new Supervisor()), "easupervisor")


  override def onStart(app: Application) {
    Logger.info("Application has started")

  }    

}
4

1 回答 1

1

正确的地方是 Global 对象。我通常采用的方法是在onStart方法中初始化主管并使用简单的基于构造函数的依赖注入:

object Global extends GlobalSettings {  

  var supervisor: ActorRef = _

  override def onStart(app: Application) {
    supervisor = Akka.system().actorOf(Props(new Supervisor()), "easupervisor")
  }

  override def getControllerInstance[A](controllerClass: Class[A]): A = {

    val MY_CONTROLLER = classOf[MyController]

    val instance = controllerClass match {
      case MY_CONTROLLER => new MyController(supervisor)
      case _ => super.getControllerInstance(controllerClass)
    }

    instance.asInstanceOf[A]
  }
}

作为替代方案,您还可以使用控制器中的地址获取主管参与者引用。

于 2014-06-10T18:30:16.777 回答