替换GlobalSettings.onStart和onStop

时间:2015-06-05 13:35:33

标签: java playframework playframework-2.4

我正在尝试将我的GlobalSettings迁移到playframework 2.4但是我很难理解我应该做什么。

目前我的Global就像下面一样,我已经将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();
            }
        }
    }

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:3)

正如答案的补遗。如果使用' asEagerSingleton()'来实例化一个类。并且它取决于播放应用程序已经开始然后你必须' @Inject()'将应用程序放入类构造函数中以确保它可用。

我的问题是由于我的旧代码(2.4之前版本)使用了静态导入play.api.Play.current'而不是将播放应用程序对象作为构造函数参数传递。

我在这个论坛帖[Play 2.4] Initialise code after Application has started

中找到了答案