バージョン情報
- Play Framework 2.3.6 Java
実行させたいジョブ
akka.actor.UntypedActor
を継承し, onReceive()
をオーバーライドします.
挨拶をコンソールに表示するジョブを作ってみましょう.
app/mypackage/HelloActor.java
package mypackage;
public class HelloActor extends akka.actor.UntypedActor {
private final String name;
public HelloActor(String name) {
this.name = name;
}
@Override
public void onReceive(Object arg) throws Exception {
System.out.println(java.text.MessageFormat.format("Hello, {0}!", name));
}
}
ジョブの登録
次に, play.GlobalSettings
を継承したクラスを作成し, onStart()
メソッドの中でジョブを登録します. 起動5秒後から, 10秒毎にジョブを実行する設定にしてみましょう.
app/mypackage/Global.java
package mypackage;
import java.util.concurrent.TimeUnit;
import scala.concurrent.duration.FiniteDuration;
public class Global extends play.GlobalSettings {
private akka.actor.Cancellable canceller = null;
@Override
public void onStart(play.Application application) {
System.out.println("BEGIN GREETING");
super.onStart(application);
akka.actor.ActorRef actor = play.libs.Akka.system().actorOf(
akka.actor.Props.create(HelloActor.class, "world")
);
canceller = play.libs.Akka.system().scheduler().schedule(
FiniteDuration.create( 5, TimeUnit.SECONDS), // スケジュール開始時点から初回実行までの時間.
FiniteDuration.create(10, TimeUnit.SECONDS), // 2回目以降の実行間隔.
actor,
"N/A", // onReceiveの第1引数に渡る値. nullだとジョブ実行時に例外が飛ぶ.
play.libs.Akka.system().dispatcher(),
null
);
}
@Override
public void onStop(play.Application application) {
System.out.println("END GREETING");
if(canceller != null) {
canceller.cancel();
}
super.onStop(application);
}
}
onStartのついでにonStopも実装して, アプリケーション終了前にジョブをキャンセルするようにしてみました. 実際にはアプリケーション終了時に手動でジョブを止める必要はないと思いますが, 登録から停止までのサンプルということで.
GlobalSettingsの場所を指定する
最後に, 上で書いたGlobal.java
の位置をplayに教えてあげましょう.
application.conf
に書きます.
conf/application.conf
application.global=mypackage.Global
追記
activator run
で起動した場合, onStartが呼ばれるのは起動した瞬間ではなく, 起動後初回のAction実行時(ブラウザでページを見ようとしたときとか)です. そういえばこれでハマってたのを思い出した.