(javaのバージョンが許せば無名クラスでも構わない) public void doJob() メソッドを実装し、行ないたい処理を書く。処理結果をTクラスで返したいときは、 play.jobs.job<T> を継承し、public T doJobWithResult() メソッドを実装する。
Promise<V> オブジェクトを戻り値に持つので、play.mvc.Controller.await(int) を用いてジョブの終了まで、リクエストをサスペンド状態にすることができる。サスペンド状態にすると、コネクションが解放されるので、次のリクエストを処理することができる。応答に長時間かかるリクエストで合っても、コネクションを占有しないで済むとされる。 アプリケーション開始時に実行ジョブクラスに対し、@OnApplicationStart アノテーションを付与すると、アプリケーション開始時にジョブが実行される。処理結果は残らない。 アノテーションのasyncプロパティはデフォルトはfalseになっており、ジョブ処理が終了するまでアプリケーションは開始しない。 async=trueに設定すると、バックグラウンドで動作する。 細かいこと
play.Play.stop() が実行されたときなので、必ず実行されるとは限らない。onApplicationStop() イベント内より実行される。インスタンスは終了時に生成される。 一定間隔で実行ジョブクラスに対し、@Every アノテーションを付与すると、引数に指定した間隔でジョブが実行される。
引数に上記の間隔文字列ではなく、"cron.hoge" と指定すると、 application.conf に設定した値を参照する。conf/application.conf cron.hoge=3h インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。 @Every と同じく、"cron.hoge" のように指定すると、application.conf の設定を参照する。インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。 おまけ定期ジョブの実行は、java.util.concurrent.ScheduledThreadPoolExecutorクラスで実現している。sardineの日記 - scheduleAtFixedRate() の正確さ ここの情報をみると、あまり時刻に正確さを期待してはいけないのかもしれない。 |
playframework1 > job >