我正在尝试将我的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();
}
}
}
答案 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
中找到了答案