2011-02-05 8 views
32

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

ответ

29

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

@OnApplicationStart 
public class Bootstrap extends Job { 

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

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

25

В 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..."); 
    } 
} 

получения дополнительной информации перейдите к playframework docs: JavaGlobal

+3

[Версия документа Scala для 2.3.x] (https://www.playframework.com/documentation/2.3.x/ScalaGlobal) – mjswensen

+0

до 2.4, возможно, 2.5 use di с ApplicationLifecycle – Jasonw

+0

Это устарело в 2.6.x: https://www.playframework.com/documentation/2.6.x/GlobalSettings – Spen

6

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

+1

Привет, я планирую использовать Play 2.4, кажется, что асинхронный Job был удален из него? Если это так, знаете ли вы что-то, что может сделать то же самое? – iCodeLikeImDrunk

+1

https://www.playframework.com/documentation/2.4.x/GlobalSettings – Isn0gud

+0

«application.global» может использоваться в файле application.conf для размещения глобального файла в любом месте – Anirudh

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

Приведен пример in an application.

Смежные вопросы