将Play 2.0 Web应用程序与非WEB功能相结合



我正在启动一个应该提供两者的项目:

  • 简单的HTTP API和
  • 其他一些功能(包括一些低级网络)。

这就是为什么我想将"其他功能"与(新的)播放框架项目集成在一起,并利用它的飞行汇编和其他好处。该应用程序的大部分(在业务逻辑和服务器负载方面)都将在项目的非WEB部分中。

所以我的问题是:如何将两个模块包装到一个Scala应用程序中?

我认为我发现的最好的方法是将非WEB部分视为游戏项目的插件。但是,我不确定这是正确的方法,考虑到该应用程序的大部分可能最终都在这样的"插件"中。

我考虑将这两个部分部署为单独的应用程序,但我怀疑这对我有用:我希望应用程序共享(除其他)缓存,配置和DB连接,并且我不应该真正分开它们。

我尚未经历过Scala或Play的经验,因此我将非常感谢您的投入。

我建议使用Akka Actor Systems集成您现有的业务逻辑和网络服务。您可以轻松地添加多个AKKA Actor系统,并将它们集成到Play应用程序中的完整系统中。游戏还带有一个可以利用的内部演员系统。

因此,您可以本身将现有逻辑包装到Actor系统中,也可以构建小型演员系统,以照顾与现有系统的集成,并在Play应用程序加载时将这些连接器作为Actor Systems启动。p>这是一个示例,当Play应用程序加载时,如何加载内部演员系统。

object Global extends GlobalSettings {
  override def onStart(app: Application) {
    Logger.info("Application starting...")
    lazy val enabled = Play.configuration.getString("external-service").filter(_ == "enabled").isDefined
    // Start External service
    enabled match {
      case true => {
        Logger.info("External service is enabled.")
        Akka.system.actorOf(Props[ExternalServiceClient], name = "serviceClient")
      }
      case false => {
        Logger.info("External service is disabled.")
      }
    }
  }
  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }
}

您还可以在需要时加载新的Actor Systems,执行此类操作。

  import akka.actor.ActorSystem
  val eventSystem = ActorSystem("events")
  // Start a service using the ActorSystem
  val eventService = EventService(eventSystem)
  // Create an Actor in the ActorSystem
  val eventActor = eventSystem.actorOf(Props[EventActor], name = "eventactor")

您可以在此处阅读有关播放Akka集成的更多信息。Play还具有内置功能,您可以利用具有诸如ScalaAsync等功能的内置演员系统。因此,如果您的外部服务主要是基于HTTP的服务,方法可能最适合您。如果您为外部服务构建了演员系统,则可以访问,然后作为远程参与者,如这里所述

最新更新