2015-06-05 8 views
6

Sto provando a migrare i miei GlobalSettings su PlayFramework 2.4 ma sto facendo fatica a capire cosa dovrei fare.Sostituzione di GlobalSettings.onStart e onStop

Attualmente la mia globale è come qui di seguito, ho già spostato l'onRequest al RequestHandler correttamente:

public class Global extends GlobalSettings { 

     private BackgroundTasks backgroundTasks; 



     @Override 
     public void onStart(Application arg0) { 
      Logger.info("Starting background tasks"); 
      backgroundTasks = new BackgroundTasks(); 
     } 

     @Override 
     public void onStop(Application arg0) { 
      Logger.info("Stopping background tasks"); 
      backgroundTasks.shutdown(); 
      super.onStop(arg0); 

      Logger.info("Saving modules data"); 
      for(Module m: controllers.Application.modules){ 
       m.saveData(); 
      } 
     } 
    } 

risposta

11

penso che dovrebbe essere lungo la linea di (senza pacchetto & importazioni) ...

OnStartModule.java:

public class OnStartModule extends AbstractModule { 
    @Override 
    protected void configure() {  
    bind(BackgroundTasks.class).asEagerSingleton(); 
    } 
} 

BackgroundTasks.java:

@Singleton 
public class BackgroundTasks { 

    @Inject 
    public BackgroundTasks(ApplicationLifecycle lifecycle) { 
    lifecycle.addStopHook(() -> { 
     Logger.info("Stopping background tasks"); 
     this.shutdown(); 

     Logger.info("Saving modules data"); 
     for(Module m: controllers.Application.modules){ 
     m.saveData(); 
     } 
     return F.Promise.pure(null); 
    }); 
    } 
} 

application.conf:

play.modules.enabled += "OnStartModule" 
+0

Questo è tutto, grazie! – Gonzague

+0

Questa è solo una mezza soluzione. ApplicationLifecycle ha 'addStopHook' ma nessun 'addStartHook' equivalente. Qual è la sostituzione del metodo GlobalSettings.onStart? – glidester

+0

@glidester Non c'è addStartHook perché si suppone che si usi Module.configure(). In questa domanda, vogliamo creare un BackgroundTasks all'avvio, quindi lo istanziamo con asEagerSingleton() all'interno di configure(). ps asSingleton() è pigro – ePak

3

Proprio come un addendum alla risposta. Se si crea un'istanza di una classe utilizzando 'asEagerSingleton()' e dipende dall'applicazione di riproduzione che è già stata avviata, è necessario '@Inject()' l'applicazione nel costruttore della classe per assicurarsi che sia disponibile.

Il mio problema era dovuto al mio vecchio codice (precedente alla 2.4) che utilizzava "import play.api.Play.current" statico invece di passare l'oggetto dell'applicazione di riproduzione come argomento del costruttore.

ho scoperto la risposta nel post questo forum [Play 2.4] Initialise code after Application has started