起動時にいくつかのコードを実行して、いくつかのものをプリキャッシュし、タイマーを開始して、Webリクエストのクリティカルパスの外にあるものを再キャッシュしたいと思います。これはPlay Frameworkで可能ですか?そしてどこに私はこのコードを入れましたか?
アプリケーションの起動時にPlayによって実行されるbootstrapジョブを作成する必要があります。
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
//do stuff
}
}
これを行う方法の詳細については、 プレイマニュアル を参照してください。
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 にアクセスしてください。
Play 2.4。+では、(オプションの)ライフサイクルフックで依存関係注入を使用する必要があります。 PlayはルートパッケージにあるModule
というクラスを自動的に使用します。
例えば:
app/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(())
}
//...
}
app/Module.scala:
import com.google.inject.AbstractModule
class Module extends AbstractModule {
override def configure() = {
bind(classOf[ApplicationStart]).asEagerSingleton()
}
}
Playframework docs にあるこのパターンの詳細なドキュメント。
次に例を示します アプリケーション内 。
上記のコードが回答アプリの基本パッケージに含まれている必要があります(パッケージ仕様なし)であることを忘れないでください。 (私は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);
}
}
次のようにプロジェクト構造内にあります:
(私はIntelliJ IDEAを使用しています)。
JavaのPlay Frameworkバージョン2.7.1以降:
/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"
ロガー用にいくつかのシステムプロパティを準備する必要がありますが、ロガーは熱心なシングルトンの前に初期化されているようです。だから私はカスタマイズされたアプリケーションローダーでそれをする必要があります:
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
参照: