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
希望对您有所帮助)
我正在尝试在我的游戏应用程序中创建一个简单的 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
希望对您有所帮助)