Подтвердить что ты не робот

Где я могу поставить код запуска в Play Framework?

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

4b9b3361

Ответ 1

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

@OnApplicationStart
public class Bootstrap extends Job {

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

Подробнее о том, как это сделать в Play Manual.

Ответ 2

Для playframework 2. 6+, пожалуйста, обратитесь к документу playframework: готовые привязки

Для 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

Ответ 3

В 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.

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

Ответ 4

Не забывайте, что код, показанный в приведенных выше ответах, должен находиться в базовом пакете вашего приложения (без спецификации пакета). (Я запускаю Play Framework 2.3.2).

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

Ответ 5

Начиная с 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"

Ответ 6

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

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