我想在启动时运行一些代码来预先缓存一些东西,并且还想启动一个Timer来重新缓存Web请求的关键路径之外的一些东西.这是可以使用Play Framework,我把这个代码放在哪里?
dog*_*ane 32
您需要创建一个引导作业,该作业将在应用程序启动时由Play执行.
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
nav*_*ins 26
在playframework 2.0及更高版本中,使用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...");
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息,请访问playframework docs:JavaGlobal
在Play 2.4.+中,您应该使用依赖注入和(可选)生命周期钩子.Play将自动使用Module
root包中的任何类.
例如:
应用程序/ 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(())
}
//...
}
Run Code Online (Sandbox Code Playgroud)
应用程序/ Module.scala:
import com.google.inject.AbstractModule
class Module extends AbstractModule {
override def configure() = {
bind(classOf[ApplicationStart]).asEagerSingleton()
}
}
Run Code Online (Sandbox Code Playgroud)
Playframework文档中有关此模式的更多文档.
这是应用程序中的一个示例.
不要忘记上面答案中显示的代码必须位于应用程序的基本包中(无包装规范).(我正在运行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);
}
}
Run Code Online (Sandbox Code Playgroud)
位于项目结构中,如下所示:
(我正在使用IntelliJ IDEA).
归档时间: |
|
查看次数: |
20963 次 |
最近记录: |