web-dev-qa-db-fra.com

Où puis-je mettre le code de démarrage dans Play Framework?

Je souhaite exécuter du code au démarrage pour pré-mettre en cache des éléments, et également démarrer un minuteur afin de remettre en cache des éléments hors du chemin critique d'une requête Web. Est-ce possible avec Play Framework, et où donc ai-je mis ce code?

35
sanity

Vous devez créer un travail d'amorçage qui sera exécuté par Play au moment du démarrage de l'application. 

@OnApplicationStart
public class Bootstrap extends Job {

    public void doJob() {
       //do stuff
    }    
}

Pour en savoir plus sur la procédure à suivre, consultez le manuel Play Manual .

31
dogbane

Dans playframework 2.0 et supérieur , utilisez GlobalSettings, en tant que code suivant:

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...");
  }  
}

pour plus d'informations, accédez à Documents Playframework: JavaGlobal

26
navins

Dans Play 2.4. + vous devez utiliser une injection de dépendance avec un hook (facultatif) du cycle de vie. Play utilisera automatiquement toute classe appelée Module qui se trouve dans le package racine.

Par exemple:

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()
  }
}

Plus de documentation sur ce modèle dans Documents Playframework .

Voici un exemple dans une application

6

N'oubliez pas que le code indiqué dans les réponses ci-dessus doit figurer dans le package de base de votre application (aucune spécification de package). (Je suis en train de jouer Play Framework 2.3.2). 

De plus, le code ne sera pas exécuté en mode dev tant que la première requête HTTP n'est pas faite!

Dans mon cas, mon code est le suivant:

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);
    }
}

Situé dans la structure du projet comme ceci:

project structure

(J'utilise IntelliJ IDEA).

6

J'ai besoin de préparer certaines propriétés système pour l'enregistreur, mais il semble que l'enregistreur soit initialisé avant les singletons désireux. J'ai donc besoin de le faire dans un chargeur d'application personnalisé:

import play.api.ApplicationLoader
import play.api.inject.guice.{GuiceApplicationLoader, GuiceableModule}

class MyAppStartup extends GuiceApplicationLoader {
    override protected def overrides(context: ApplicationLoader.Context): Seq[GuiceableModule] = {
        // set system properties for logger configuration template
        super.overrides(context)
    }
}

ajouter à application.conf: play.application.loader = MyAppStartup référence: 

0
fishautumn