Java 替换GlobalSettings.onStart和onStop
我正在尝试将我的GlobalSettings迁移到playframework 2.4,但我很难理解我应该做什么 当前我的全局设置如下所示,我已经将onRequest正确地移出到RequestHandler: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
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很高兴听到。对不起,我没能早点给你回电话。