我在哪里将启动代码放在Play Framework中?

san*_*ity 39 playframework

我想在启动时运行一些代码来预先缓存一些东西,并且还想启动一个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)

Play手册中阅读有关如何执行此操作的详细信息.


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

  • [文档的Scala版本,适用于2.3.x](https://www.playframework.com/documentation/2.3.x/ScalaGlobal) (4认同)

Mic*_*ski 7

Play 2.4.+中,您应该使用依赖注入和(可选)生命周期钩子.Play将自动使用Moduleroot包中的任何类.

例如:

应用程序/ 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文档中有关此模式的更多文档.

是应用程序中的一个示例.


Joã*_*lva 6

不要忘记上面答案中显示的代码必须位于应用程序的基本包中(无包装规范).(我正在运行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).