【问题标题】:Setting up akka in playframework, how to configure and get hold of ActorSystem?在playframework中设置akka,如何配置和获取ActorSystem?
【发布时间】: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


【解决方案1】:

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

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

希望对你有帮助)

【讨论】:

  • 我还必须在我假设的 application.conf 中定义“我的系统”,以及设置等。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2019-11-06
  • 2014-02-21
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多