playframework中设置akka,如何配置和获取ActorSystem?

Setting up akka in playframework, how to configure and get hold of ActorSystem?

我正在尝试在我的游戏应用程序中创建一个简单的 akka 设置。

import akka.actor._
import akka.event.Logging
class HelloActor extends Actor with ActorLogging{
  def receive = {
    case "hello" => log.info("hello received")
    case _ => log.info("catch call received")
  }
}

我读到我应该在全局中创建我的 ActorSystem,但是我应该创建一个单例来保存引用吗?

Global.scala

override def onStart(app: Application) {
  // ???
}

我的 play 应用程序中有一个简单的 json 端点,因此每当调用 api 端点时,我想将消息传递给我的 akka actor。

我基本上是在围绕 play 创建一个 akka 系统,这样它就可以通过 http 发送消息。

// /testAkka/
def testAkka = Action(BodyParsers.parse.json) { request =>

    val message1Result = request.body.validate[Message1]
    message1Result.fold(
      errors => {
        BadRequest(Json.obj("status" -> "KO", "message" -> JsError.toFlatJson(errors)))
      },
       msg1 => {
         val helloActor = system.actorOf(Props(new HelloActor("Fred")), name = "helloactor")
         helloActor ! msg1.name
         Ok(Json.toJson(msg1))
       }
    )
  }

注: 我不想在游戏中使用默认的 akka 系统,我需要在 application.conf

中创建自己的系统

**我应该如何在 Global.scala 的 onStart 方法中创建我的 ActorSystem 以及我将如何在我的控制器中引用它? 另外,是否有 play 2.2.3 的示例 application.conf 设置? **

首先,您可以在 common 包中定义您的 Global.scala,如下所示(它不能在默认包中,因为您将无法访问 class) :

import play.api._

package common

object Global extends GlobalSettings {

  val mySystem = ActorSystem("my-system")

  override def onStart(app: Application) {
    // initialize your stuff here
  }

}

然后您可以在您的控制器中使用该系统,如下所示:

def testAkka = Action(BodyParsers.parse.json) { request =>

    val message1Result = request.body.validate[Message1]
    message1Result.fold(
      errors => {
        BadRequest(Json.obj("status" -> "KO", "message" -> JsError.toFlatJson(errors)))
      },
       msg1 => {
         val helloActor = Global.mySystem.actorOf(Props(new HelloActor("Fred")), name = "helloactor")
         helloActor ! msg1.name
         Ok(Json.toJson(msg1))
       }
    )
  }

最后,您必须调整 application.conf 并指定您的 Global.scala 位于非默认位置:

global=common.Global

虽然我不是很确定,如果在Play 2.2.x你可能要写:

application.global=common.Global

希望对您有所帮助)