Voglio eseguire un codice all'avvio per pre-memorizzare alcune cose, e vorrei anche avviare un timer per ri-memorizzare alcune cose al di fuori del percorso critico di una richiesta web. È possibile con Play Framework e dove ho inserito questo codice?Dove inserisco il codice di avvio in Play Framework?
risposta
È necessario creare un processo di bootstrap che verrà eseguito da Riproduci all'avvio dell'applicazione.
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
//do stuff
}
}
Ulteriori informazioni su come eseguire questa operazione nello Play Manual.
In play framework 2.0 e superiori, utilizzare GlobalSettings, come il seguente codice:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
Logger.info("Application has started");
}
@Override
public void onStop(Application app) {
Logger.info("Application shutdown...");
}
}
ulteriori informazioni, visitare il playframework docs: JavaGlobal
Non dimenticare che il codice mostrato nelle risposte di cui sopra ha essere nel pacchetto base della tua app (nessuna specifica del pacchetto). (Sto eseguendo Play Framework 2.3.2).
Inoltre, il codice non verrà eseguito in modalità dev finché non viene effettuata la prima richiesta HTTP!
Nel mio caso il mio codice è questo:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
String message = "Application has started! LOLADA";
Logger.info(message);
System.out.println(message);
}
@Override
public void onStop(Application app) {
String message = "Application shutdown...!!! LOLADA";
Logger.info(message);
System.out.println(message);
}
}
Situato nella struttura del progetto come questo:
(sto usando IntelliJ IDEA).
Ciao, sto pianificando di utilizzare Play 2.4, sembra che il lavoro asincrono sia stato rimosso da esso? Se è così, sai qualcosa che può fare lo stesso? – iCodeLikeImDrunk
https://www.playframework.com/documentation/2.4.x/GlobalSettings – Isn0gud
"application.global" può essere utilizzato nel file application.conf per posizionare il file globale ovunque – Anirudh
In Play 2.4. + È necessario utilizzare l'integrazione delle dipendenze con un hook del ciclo di vita (facoltativo). Play utilizzerà automaticamente qualsiasi classe chiamata Module
presente nel pacchetto radice.
Ad esempio:
app/ApplicationStart.scala:
import scala.concurrent.Future
import javax.inject._
import play.api.inject.ApplicationLifecycle
// This creates an `ApplicationStart` object once at start-up and registers hook for shut-down.
@Singleton
class ApplicationStart @Inject() (lifecycle: ApplicationLifecycle) {
// Shut-down hook
lifecycle.addStopHook {() =>
Future.successful(())
}
//...
}
app/Module.scala:
import com.google.inject.AbstractModule
class Module extends AbstractModule {
override def configure() = {
bind(classOf[ApplicationStart]).asEagerSingleton()
}
}
Più documentazione di questo modello in Playframework docs.
Ecco un esempio in an application.
[Versione Scala dei documenti, per 2.3.x] (https://www.playframework.com/documentation/2.3.x/ScalaGlobal) – mjswensen
fino a 2.4, forse, 2,5 uso di con ApplicationLifecycle – Jasonw
Questo è deprecato in 2.6.x: https://www.playframework.com/documentation/2.6.x/GlobalSettings – Spen