Где я могу разместить код запуска в Play Framework? - PullRequest
38 голосов
/ 05 февраля 2011

Я хочу запустить некоторый код при запуске, чтобы предварительно кэшировать некоторые вещи, а также хотел бы запустить таймер, чтобы повторно кэшировать некоторые вещи вне критического пути веб-запроса. Возможно ли это с помощью Play Framework, и где я разместил этот код?

Ответы [ 6 ]

31 голосов
/ 05 февраля 2011

Вам необходимо создать задание начальной загрузки, которое будет выполняться Play во время запуска приложения.

@OnApplicationStart
public class Bootstrap extends Job {

    public void doJob() {
       //do stuff
    }    
}

Подробнее о том, как это сделать, читайте в Руководстве по игре .

25 голосов
/ 13 апреля 2013

Для playframework 2.6 + , пожалуйста, обратитесь к playframework doc: Готовые привязки

Для 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...");
  }  
}

дополнительная информация, перейдите к документация по игровой рамке: JavaGlobal

7 голосов
/ 08 декабря 2017

В 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()
  }
}

Дополнительная документация по этому шаблону приведена в Документация по игровым рамкам .

Вот пример в приложении .

5 голосов
/ 18 мая 2015

Не забывайте, что код, показанный в ответах выше , должен находиться в базовом пакете вашего приложения (без указания пакета).(Я использую 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).

1 голос
/ 30 апреля 2019

Начиная с версии Play Framework 2.7.1, на Java:

В /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"
0 голосов
/ 29 октября 2018

Мне нужно подготовить некоторые системные свойства для логгера, но кажется, что логгер инициализируется перед нетерпеливыми одиночками Поэтому мне нужно сделать это в специализированном загрузчике приложений:

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 ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...