20
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Play Frameworkでの定期ジョブ実行

Last updated at Posted at 2015-02-23

バージョン情報

  • 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実行時(ブラウザでページを見ようとしたときとか)です. そういえばこれでハマってたのを思い出した.

20
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?