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

时间:2011-02-05 15:12:03

标签: playframework

我想在启动时运行一些代码来预先缓存一些东西,并且还想启动一个Timer来重新缓存Web请求关键路径之外的一些东西。这是可以使用Play Framework吗?我把这个代码放在哪里?

6 个答案:

答案 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);
    }
}

位于项目结构中:

project structure

(我正在使用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 参考: