1

Play のアクター システムを使用して、アプリのスーパーバイザー (ルート) アクターを作成しています。

このルート アクターに対して最初に行う必要があるのは、自身と一連の子アクターを構成するためのメッセージを送信することです。構成には、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 に答える