在play框架中设置akka,如何配置和获取ActorSystem?

时间:2015-01-19 02:12:46

标签: scala playframework akka

我试图在我的播放应用程序中创建一个简单的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) {
  // ???
}

我的播放应用程序中有一个简单的json端点,所以无论何时调用api端点,我都希望将消息传递给我的akka​​ actor。

我基本上是围绕游戏创建一个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?如何在Controller中引用它? 另外,是否有一个示例application.conf设置为play 2.2.3? **

1 个答案:

答案 0 :(得分:2)

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

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

希望它有所帮助)