【发布时间】:2015-01-19 23:49:02
【问题描述】:
我正在尝试在我的 play 应用程序中创建一个简单的 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 演员。
我基本上是在围绕游戏创建一个 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))
}
)
}
注意: 我不想在play中使用默认的akka系统,我需要在application.conf中创建自己的
**我应该如何在 Global.scala 的 onStart 方法中创建我的 ActorSystem 以及如何在我的 Controller 中引用它? 此外,是否有适用于 play 2.2.3 的示例 application.conf 设置? **
【问题讨论】:
-
你不能把它放在
Global伴侣中,在onStart中初始化它并在你所有的控制器类中访问它?当然,您可以将 application.conf 中的Global从默认包中移出以实现此目的。 -
@kaktusito 我在 Global.scala 的 onStart 中初始化它,这是错误的吗?
-
你可以在onStart中初始化,没关系。但是您必须在 onStart 方法之外声明它才能从控制器类中访问。
-
@kaktusito 这就是我所困惑的,我应该把它放在一个单例对象中吗?
-
啊,明白了。好吧,在我之前工作过的项目中,我通常将自己的
ActorSystem放在 Global.scala 中(以防你不想使用 Play 的默认ActorSystem),这样我就可以从控制器类中使用它。我没有创建一个额外的单例对象来包含它。但是如果你需要其他类型的全局对象,那么你可能需要使用依赖注入来简化测试。尽管如此,这只是我的意见:)
标签: scala playframework akka