gpt4 book ai didi

scala - 如何在Scala Play框架中对服务器启动执行操作?

转载 作者:行者123 更新时间:2023-12-03 13:31:14 25 4
gpt4 key购买 nike

我在servers.conf目录中有一个配置文件conf/,只要路由/servers被命中,它就会由ServerController读取。这不是有效的,因为当文件连续更改时,每次连续命中时都需要重新读取配置文件。此外,如果配置文件存在问题,我可以尽快告诉用户,而不是在页面点击时抛出异常。

目前,我的ServerController.scala中包含以下内容:

case class Server(ip: String, port: String)

/**
* This controller creates an `Action` to handle HTTP requests to the
* application's server page.
*/
@Singleton
class ServerController @Inject() extends Controller {

/**
* Create an Action to render an HTML page with a the list of servers.
* The configuration in the `routes` file means that this method
* will be called when the application receives a `GET` request with
* a path of `/servers`.
*/
def index = Action {

val serverList = ConfigFactory.load().getConfigList("servers")
val servers: List[Server] = serverList match {
case null => Nil
case _ => serverList map { s =>
Server(s.getString("ip"), s.getString("port"))
} filter { s =>
s.ip != null && s.port != null
}.toList
}

Ok(views.html.servers(servers))
}
}


我的目标是让服务器在启动时读取配置文件,如果在配置文件中读取没有问题,则在路由被点击时将服务器列表传递给ServerController。如果有问题,我希望立即引发异常。

但是,我似乎找不到应用程序的入口点,所以我不知道如何在启动时执行操作。

有谁知道如何做到这一点?我正在使用Play2.5.x。

最佳答案

如果您使用的是最新版本的Play,它将在启动时查找根包中任何名为Module的类(即,文件顶部没有package定义)。这是一个取自Play 2.5.x最新激活器模板的示例,我已对其进行了修改,以演示在应用程序启动和关闭时运行代码:

services/Say.scala中,说“ Hello!”将是一项简单的服务。在启动时和“再见!”当应用程序关闭时:

package services

import javax.inject._
import play.api.inject.ApplicationLifecycle
import scala.concurrent.Future

trait Say {
def hello(): Unit
def goodbye(): Unit
}

@Singleton
class SayImpl @Inject() (appLifecycle: ApplicationLifecycle) extends Say {
override def hello(): Unit = println("Hello!")
override def goodbye(): Unit = println("Goodbye!")

// You can do this, or just explicitly call `hello()` at the end
def start(): Unit = hello()

// When the application starts, register a stop hook with the
// ApplicationLifecycle object. The code inside the stop hook will
// be run when the application stops.
appLifecycle.addStopHook { () =>
goodbye()
Future.successful(())
}

// Called when this singleton is constructed (could be replaced by `hello()`)
start()
}


在Module.scala中,

import com.google.inject.AbstractModule
import services._

/**
* This class is a Guice module that tells Guice how to bind several
* different types. This Guice module is created when the Play
* application starts.

* Play will automatically use any class called `Module` that is in
* the root package. You can create modules in other locations by
* adding `play.modules.enabled` settings to the `application.conf`
* configuration file.
*/
class Module extends AbstractModule {

override def configure() = {
// We bind the implementation to the interface (trait) as an eager singleton,
// which means it is bound immediately when the application starts.
bind(classOf[Say]).to(classOf[SayImpl]).asEagerSingleton()
}
}


您可能发现有用的其他一些资源是 the Scala dependency injection (DI) documentationthe Guice documentation。 Guice是Play使用的默认DI框架。

关于scala - 如何在Scala Play框架中对服务器启动执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com