我试图在我的播放应用程序中创建一个简单的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? **
答案 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
希望它有所帮助)