Wie kann ich eine Aktion ausführen auf server startup in die Scala, Play Framework?
Habe ich eine config-Datei servers.conf
in meinem conf/
- Verzeichnis, das Lesen von meinem ServerController, wenn die route /servers
ist der hit. Das ist nicht performant, weil es erfordert ein neu-Einlesen der Konfiguration-Datei auf jedem aufeinander folgenden Treffer, wenn die Datei nicht ändern. Weiter, wenn es Probleme mit der config-Datei, ich kann sagen, den user so schnell wie möglich, anstatt eine exception zu werfen auf eine Seite schlagen.
Derzeit habe ich diese in meinem 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))
}
}
Mein Ziel ist es, den server, Lesen Sie die config-Datei beim Start und übergeben Sie die Liste der Server, auf den ServerController, wenn die route wird geschlagen, wenn es keine Probleme beim Lesen in der config-Datei. Wenn es Probleme gibt, will ich eine Ausnahme geworfen werden, sofort.
Ich kann nicht scheinen zu finden, die einen Ansatzpunkt für meine Anwendung, obwohl, also ich weiß nicht, wie Aktionen auf starten.
Weiß jemand, wie dies zu tun? Ich bin mit Spielen 2.5.x.
- Welche version des Spiels benutzt du?
- Sorry. Bearbeitet die Frage.
- Haben Sie in Betracht ziehen, dass ein ganzer block von code außerhalb der Funktion index? (Es wird ausgeführt, wenn der Controller wird nur einmal gestartet, D. H. jede HTTP-Anforderung an, dass der controller)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie über die neueste version des Spiels, es sieht beim Start für jede Klasse aufgerufen
Module
ist in der root-package (das heißt, es gibt keinepackage
definition an den Anfang der Datei). Hier ist ein Beispiel, genommen aus dem aktuellen Activator-template für 2.5 Spielen.x, das habe ich geändert für die demonstration der Ausführung von code auf Anwendung startup und shutdown:In
services/Say.scala
, wäre dies eine einfache service, zu sagen "Hallo!" am Anfang und "auf Wiedersehen!", wenn die Anwendung heruntergefahren:Im Modul.scala,
Einige weitere Ressourcen, die Sie nützlich finden können, sind die Scala dependency injection (DI) - Dokumentation und die Guice-Dokumentation. Guice ist die Standard-DI-framework von Spielen.
root
Leben sollte?root
. Es ist nur eine Datei, die Leben in das root-Paket, welches ist zu sagen, es hat keinepackage
Erklärung oben. Alternativ können Sie das Modul woanders, sagen wir in einemmodules
Verzeichnis und aktivieren Sie es in Ihremapplication.conf
etwa so:play.modules.enabled += "com.example.modules"
, wocom.example.modules
sollte das Paket, zu dem das Modul gehört.root
Paket wird voraussichtlich live inapp/
standardmäßig? Das ist, wenn ichSay.scala
imservice/
undModule.scala
lebt inapp/
verpackt alsroot
sollte es funktionieren?app/
standardmäßig in der Vorlage, aber es muss nicht sein. Nur nicht fügen Sie einepackage
Erklärung zuModule.scala
und es sollte zu arbeiten./
für die erste Zeit. Kann ich mit Leben, aber gibt es keine Möglichkeit, dies zu tun, bevor alle?