1

我正在启动一个项目,该项目应该同时提供:

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

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

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

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

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

我还没有使用 Scala 或 Play 的经验,所以我非常感谢您的意见。

4

1 回答 1

5

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

因此,您可以将现有逻辑包装到一个 Actor 系统中,或者您可以构建小型 Actor 系统来负责与现有系统的集成,并在 Play 应用程序加载时将这些连接器作为 Actor 系统启动。

这是一个示例,当 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...")
  }
}

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

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

于 2012-11-04T18:03:04.090 回答