我想在启动时运行一些代码来预先缓存一些东西,并且还想启动一个Timer来重新缓存Web请求关键路径之外的一些东西。这是可以使用Play Framework吗?我把这个代码放在哪里?
答案 0 :(得分:31)
您需要创建一个引导作业,该作业将在应用程序启动时由Play执行。
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
//do stuff
}
}
详细了解如何在Play Manual。
中执行此操作答案 1 :(得分:25)
对于 playframework 2.6 + ,请参阅playframework doc: Eager bindings
对于 playframework 2.0到2.5 ,请使用GlobalSettings,如下代码:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
Logger.info("Application has started");
}
@Override
public void onStop(Application app) {
Logger.info("Application shutdown...");
}
}
更多信息,请转到playframework docs: JavaGlobal
答案 2 :(得分:7)
在 Play 2.4。+ 中,您应该使用依赖注入和(可选)生命周期钩子。 Play将自动使用根程序包中名为Module
的任何类。
例如:
应用程序/ ApplicationStart.scala:
import scala.concurrent.Future
import javax.inject._
import play.api.inject.ApplicationLifecycle
// This creates an `ApplicationStart` object once at start-up and registers hook for shut-down.
@Singleton
class ApplicationStart @Inject() (lifecycle: ApplicationLifecycle) {
// Shut-down hook
lifecycle.addStopHook { () =>
Future.successful(())
}
//...
}
应用程序/ Module.scala:
import com.google.inject.AbstractModule
class Module extends AbstractModule {
override def configure() = {
bind(classOf[ApplicationStart]).asEagerSingleton()
}
}
Playframework docs中有关此模式的更多文档。
以下是in an application的示例。
答案 3 :(得分:5)
不要忘记上面答案中显示的代码必须位于您应用的基础包中(无包装规格)。 (我正在运行Play Framework 2.3.2)。
此外,在发出第一个HTTP请求之前,代码不会以开发模式运行!
就我而言,我的代码是:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
String message = "Application has started! LOLADA";
Logger.info(message);
System.out.println(message);
}
@Override
public void onStop(Application app) {
String message = "Application shutdown...!!! LOLADA";
Logger.info(message);
System.out.println(message);
}
}
位于项目结构中:
(我正在使用IntelliJ IDEA)。
答案 4 :(得分:1)
从Java 2.7.1版的Play框架开始:
在/app/startup/Startup.java
中:
package startup;
public class Startup {
public Startup() {
System.out.println("I ran on startup!");
}
}
在/app/startup/StartupBinder.java
中:
package startup;
import com.google.inject.AbstractModule;
public class StartupBinder extends AbstractModule {
protected void configure() {
bind(Startup.class).asEagerSingleton();
}
}
然后将其添加到您的/conf/application.conf
文件中:
play.modules.enabled += "startup.StartupBinder"
答案 5 :(得分:0)
我需要为记录器准备一些系统属性,但是看来记录器在渴望单例之前是初始化的。因此,我需要在自定义的应用程序加载器中进行操作:
import play.api.ApplicationLoader
import play.api.inject.guice.{GuiceApplicationLoader, GuiceableModule}
class MyAppStartup extends GuiceApplicationLoader {
override protected def overrides(context: ApplicationLoader.Context): Seq[GuiceableModule] = {
// set system properties for logger configuration template
super.overrides(context)
}
}
添加到application.conf
:
play.application.loader = MyAppStartup
参考: