Я хочу запустить некоторый код при запуске, чтобы предварительно кэшировать некоторые вещи, а также хотел бы запустить таймер для повторного кэширования некоторых вещей за пределами критического пути веб-запроса. Возможно ли это с помощью Play Framework, и где я поместил этот код?
Где я могу поставить код запуска в Play Framework?
Ответ 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);
}
}
Расположен в структуре проекта следующим образом:
(Я использую 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
ссылка: