2011-02-05 8 views
32

Quiero ejecutar algún código al inicio para precachear algunas cosas, y también me gustaría iniciar un temporizador para volver a almacenar en caché algunas cosas fuera de la ruta crítica de una solicitud web. ¿Es esto posible con Play Framework, y dónde lo coloco?¿Dónde pongo el código de inicio en Play Framework?

Respuesta

29

Debe crear un trabajo de arranque que será ejecutado por Play en el momento de inicio de la aplicación.

@OnApplicationStart 
public class Bootstrap extends Job { 

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

Más información sobre cómo hacerlo en el Play Manual.

25

En playframework 2.0 y superior, utilice GlobalSettings, como el código siguiente:

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

más información, vaya a playframework docs: JavaGlobal

+3

[Versión de Scala de los documentos, para 2.3.x] (https://www.playframework.com/documentation/2.3.x/ScalaGlobal) – mjswensen

+0

hasta 2.4 quizás, 2.5 use di con ApplicationLifecycle – Jasonw

+0

Esto está en desuso en 2.6.x: https://www.playframework.com/documentation/2.6.x/GlobalSettings – Spen

6

No hay que olvidar que el código se muestra en las respuestas anteriores tiene para estar en el paquete base de su aplicación (sin especificación del paquete). (Estoy ejecutando Play Framework 2.3.2).

Además, ¡el código no se ejecutará en modo dev hasta que se realice la primera solicitud HTTP!

En mi caso mi código es la siguiente:

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

Ubicado en la estructura del proyecto como este:

project structure

(estoy usando IntelliJ IDEA).

+1

Hola, estoy planeando usar Play 2.4, parece que el trabajo asincrónico ha sido eliminado de él? Si ese es el caso, ¿sabes algo que pueda lograr lo mismo? – iCodeLikeImDrunk

+1

https://www.playframework.com/documentation/2.4.x/GlobalSettings – Isn0gud

+0

"application.global" se puede utilizar en el archivo application.conf para colocar el archivo global en cualquier lugar – Anirudh

3

En Play 2.4. + Debe usar la inyección de dependencia con un gancho de ciclo de vida (opcional). Play utilizará automáticamente cualquier clase llamada Module que se encuentre en el paquete raíz.

Por ejemplo:

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

Más documentación de este patrón en Playframework docs.

Aquí hay un ejemplo in an application.

Cuestiones relacionadas