2011-02-05 4 views
32

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

29

È 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.

25

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

+3

[Versione Scala dei documenti, per 2.3.x] (https://www.playframework.com/documentation/2.3.x/ScalaGlobal) – mjswensen

+0

fino a 2.4, forse, 2,5 uso di con ApplicationLifecycle – Jasonw

+0

Questo è deprecato in 2.6.x: https://www.playframework.com/documentation/2.6.x/GlobalSettings – Spen

6

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:

project structure

(sto usando IntelliJ IDEA).

+1

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

+1

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

+0

"application.global" può essere utilizzato nel file application.conf per posizionare il file globale ovunque – Anirudh

3

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.