Java 替换GlobalSettings.onStart和onStop

Java 替换GlobalSettings.onStart和onStop,java,playframework,playframework-2.4,Java,Playframework,Playframework 2.4,我正在尝试将我的GlobalSettings迁移到playframework 2.4,但我很难理解我应该做什么 当前我的全局设置如下所示,我已经将onRequest正确地移出到RequestHandler: public class Global extends GlobalSettings { private BackgroundTasks backgroundTasks; @Override public void onStart(Ap

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

当前我的全局设置如下所示,我已经将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();
            }
        }
    }

我认为这应该是沿着路线(没有包装和进口)

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"

作为答案的补充。如果您使用“asEagerSingleton()”实例化一个类,并且它取决于播放应用程序是否已经启动,那么您必须将该应用程序“@Inject()”注入到您的类构造函数中,以确保它可用

我的问题是由于我的旧代码(2.4之前)使用静态“import play.api.play.current”而不是将play应用程序对象作为构造函数参数传递


我在这个论坛的帖子中找到了答案

这只是半个解决方案。ApplicationLifecycle具有“addStopHook”,但没有等效的“addStartHook”。GlobalSettings.onStart方法的替代方法是什么?@glidester没有addStartHook,因为您应该使用Module.configure()。在这个问题中,我们想在启动时创建一个BackgroundTasks,所以我们在configure()中用asagerSingleton()实例化它。ps asSingleton()是lazy@ePak很抱歉延迟响应(工作让我暂时走上了另一条道路)。我的问题是,由于“asEagerSingleton()”而启动的任何内容都不能依赖于Play应用程序对象(您会得到一个“java.lang.RuntimeException:没有启动的应用程序”错误)。我正在寻找“onStart”的等价物,它在Play应用程序准备就绪后启动。ps不确定您所说的是哪个“asSingleton()”函数。@ePak我已经知道我做错了什么。我希望在启动时运行的代码依赖于使用“import play.api.play.current”的一些旧代码。我已经对它进行了更新,以便将应用程序对象注入到构造函数中,并且一切都按照我的要求进行。Thanks@glidester很高兴听到。对不起,我没能早点给你回电话。