playframework1‎ > ‎job‎ > ‎

基本的な使い方

概要

HTTPリクエストとは関係なく処理を行ないたいときに、非同期ジョブ機能がある。
(もちろんHTTPリクエストと同期して実行することもできる)

準備

play.jobs.jobクラスを継承したクラスを用意する。
(javaのバージョンが許せば無名クラスでも構わない)

public void doJob()メソッドを実装し、行ないたい処理を書く。
処理結果をTクラスで返したいときは、play.jobs.job<T>を継承し、public T doJobWithResult()メソッドを実装する。

実行する

すぐに実行

インスタンスを生成し、now(), in(), afterRequest() のいずれかのメソッドを実行する。
  • now()は、即時実行。
  • in(int)は、遅延実行。秒で指定する。引数String
  • in(String)も、遅延実行。こちらは @Everyと同じ書式。
  • afterRequest()は、HTTPリクエスト中に意味を持つ。現在実行中のアクションが終了してから実行する。
    例えば、JPAでsave()、コミット後にジョブを実行したいときに有効。
いずれのメソッドも、Promise<V>オブジェクトを戻り値に持つので、play.mvc.Controller.await(int) を用いてジョブの終了まで、リクエストをサスペンド状態にすることができる。サスペンド状態にすると、コネクションが解放されるので、次のリクエストを処理することができる。
応答に長時間かかるリクエストで合っても、コネクションを占有しないで済むとされる。

アプリケーション開始時に実行

ジョブクラスに対し、@OnApplicationStartアノテーションを付与すると、アプリケーション開始時にジョブが実行される。
処理結果は残らない。
アノテーションのasyncプロパティはデフォルトはfalseになっており、ジョブ処理が終了するまでアプリケーションは開始しない。
async=trueに設定すると、バックグラウンドで動作する。

細かいこと
  • afterApplicationStart()イベント内より実行される。
  • 起動時にインスタンスが一度だけ生成され、スケジュール管理に残り続けるので勝手に消滅しない。
  • DEVモードでは最初のリクエストを受けたときに実行。
  • PRODモードではサービス起動時に実行。

アプリケーション終了時に実行

ジョブクラスに対し、@OnApplicationStopアノテーションを付与すると、アプリケーション終了時に実行される。
play.Play.stop()が実行されたときなので、必ず実行されるとは限らない。

onApplicationStop()イベント内より実行される。
インスタンスは終了時に生成される。

一定間隔で実行

ジョブクラスに対し、@Everyアノテーションを付与すると、引数に指定した間隔でジョブが実行される。
 単位 接尾辞 例(意味)
 日 d 3d (3日間ごと)
 時間 h 1h (1時間ごと)
 分 mn 5mn (5分ごと)
 秒 s 15s (15秒ごと)

引数に上記の間隔文字列ではなく、"cron.hoge" と指定すると、application.conf に設定した値を参照する。
conf/application.conf
cron.hoge=3h

インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。

定時に実行

ジョブクラスに対し、@Onアノテーションを付与すると、引数に指定した時間に実行される。
引数はcron書式に準拠する。
@Everyと同じく、"cron.hoge" のように指定すると、application.conf の設定を参照する。

インスタンスは起動時に一度だけ生成され、アプリケーション実行中はずっと残りつづける。

おまけ

定期ジョブの実行は、java.util.concurrent.ScheduledThreadPoolExecutorクラスで実現している。
sardineの日記 - scheduleAtFixedRate() の正確さ ここの情報をみると、あまり時刻に正確さを期待してはいけないのかもしれない。