2015-06-05 3 views
6

Я пытаюсь перенести свой GlobalSettings в playframework 2.4, но мне трудно понять, что я должен делать.Замена GlobalSettings.onStart и onStop

В настоящее время мой Глобал, как показано ниже, я уже переехал в onRequest к RequestHandler правильно:

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

ответ

11

Я думаю, что это должно быть по линии (без упаковки & импорта) ...

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

Вот так, спасибо! – Gonzague

+0

Это только половина решения. ApplicationLifecycle имеет «addStopHook», но не эквивалент «addStartHook». Какая замена для метода GlobalSettings.onStart? – glidester

+0

@glidester Нет addStartHook, потому что вы должны использовать Module.configure(). В этом вопросе мы хотим создать BackgroundTasks onStart, поэтому мы создаем его с помощью asEagerSingleton() внутри configure(). ps asSingleton() is lazy – ePak

3

Подобно тому, как добавление к ответу. Если вы создаете экземпляр класса с помощью «asEagerSingleton()», и это зависит от того, что приложение воспроизведения уже было запущено, вы должны «@Inject()» приложение в свой конструктор класса, чтобы убедиться, что оно доступно.

Моя проблема возникла из-за моего старого кода (до 2.4), используя статический «import play.api.Play.current» вместо передачи объекта приложения воспроизведения в качестве аргумента конструктора.

я обнаружил ответ на это сообщение форума [Play 2.4] Initialise code after Application has started

Смежные вопросы