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

nie*_*aki 1 scala akka playframework playframework-2.0

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

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

这就是为什么我想将"其他功能"与(新)Play框架项目集成,并利用它的即时编译和其他好处.大多数应用程序(包括业务逻辑和服务器负载)都将位于项目的非Web部分中.

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

我认为我发现的最佳方法是将非Web部件视为Play项目的插件.我不确定这是否是正确的方法,考虑到大多数应用程序可能最终会出现在这样的"插件"中.

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

我还没有Scala或Play的经验,所以我非常感谢你的意见.

Ola*_*erg 5

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

因此,您可以将现有逻辑封装到actor系统中,也可以构建小型actor系统,负责与现有系统的集成,并在Play应用程序加载时将这些连接器作为actor系统启动.

以下是在Play应用程序加载时如何加载内部actor系统的示例.

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...")
  }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以在应用程序中加载新的actor系统,执行类似的操作.

  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")
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关Play Akka集成的更多信息.Play还具有内置功能,您可以利用内置的actor系统和ScalaAsync等功能.因此,如果您的外部服务主要是基于HTTP的服务,那么这种方法可能最适合您.如果您为外部服务构建actor系统,那么您可以访问Akka Remoting中所述的远程actor