【问题标题】:Combining Play 2.0 web application with non-web functionality将 Play 2.0 Web 应用程序与非 Web 功能相结合
【发布时间】:2012-10-24 15:17:14
【问题描述】:

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

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

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

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

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

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

我还没有使用过 Scala 或 Play,因此非常感谢您的意见。

【问题讨论】:

    标签: scala playframework playframework-2.0 akka


    【解决方案1】:

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

    因此,您可以将现有逻辑封装到一个 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...")
      }
    }
    

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

      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")
    

    您可以阅读有关Play Akka integration here 的更多信息。 Play 还具有内置功能,您可以在其中利用具有 ScalaAsync 等功能的内置 actor 系统。因此,如果您的外部服务主要是基于 HTTP 的服务,那么该方法可能最适合您。如果您为外部服务构建参与者系统,则可以作为远程参与者访问,如此处所述Akka Remoting

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多