web-dev-qa-db-ja.com

Play Frameworkのどこにスタートアップコードを配置すればよいですか?

起動時にいくつかのコードを実行して、いくつかのものをプリキャッシュし、タイマーを開始して、Webリクエストのクリティカルパスの外にあるものを再キャッシュしたいと思います。これはPlay Frameworkで可能ですか?そしてどこに私はこのコードを入れましたか?

42
sanity

アプリケーションの起動時にPlayによって実行されるbootstrapジョブを作成する必要があります。

@OnApplicationStart
public class Bootstrap extends Job {

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

これを行う方法の詳細については、 プレイマニュアル を参照してください。

33
dogbane

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 にアクセスしてください。

29
navins

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 にあるこのパターンの詳細なドキュメント。

次に例を示します アプリケーション内

9

上記のコードが回答アプリの基本パッケージに含まれている必要があります(パッケージ仕様なし)であることを忘れないでください。 (私は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を使用しています)。

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"
3
Cameron Hudson

ロガー用にいくつかのシステムプロパティを準備する必要がありますが、ロガーは熱心なシングルトンの前に初期化されているようです。だから私はカスタマイズされたアプリケーションローダーでそれをする必要があります:

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.confplay.application.loader = MyAppStartup 参照:

0
fishautumn