LoginSignup
39
29

More than 5 years have passed since last update.

Playframeworkで定期実行させる - akka-quartz-schedulerを使う

Last updated at Posted at 2015-07-10

こんにちは、t_hirohataです。

最近PlayFrameworkで、指定した時間に処理を動かすプログラムを書いたので
そこで使ったライブラリをちらっとご紹介します。

元記事はこちら

akka-quartz-scheduler

今回ご紹介するのは、akka-quartz-schedulerというライブラリで、
cronのような書き方でスケジュールを設定できるというものです。
(※このライブラリはAkkaを使うので、Akkaの知識が多少必要になります。)

このライブラリを使うにはbuild.sbtに追加する必要がありますが、
Akkaのバージョンによって追加するものが異なるので、こちらを参考に追加すると良いです。

それでは早速使ってみたいと思います!

追記
この記事ではPlay2.3を使用しています。
Play2.4ではGlobalオブジェクトがdeprecatedになったので、ApplicationLifecycleを使うようにしてください。

1.application.confにスケジュールの設定を記述

設定の仕方は簡単で、application.confに以下のように書きます。

akka {
  quartz {
    schedules {
      Every5Seconds {
        description = "5秒毎に実行"
        expression = "*/5 * * ? * *"
      }
      Every10Minutes {
        description = "10分毎に実行"
        expression = "0 */10 * ? * *"
      }
      9o'clockAnd18o'clock {
        description = "JSTの9時と18時に実行"
        expression = "0 0 9,18 ? * *"
        timezone = "Asia/Tokyo"
      }
      EndOfEachMonth {
        description = "JSTの毎月末日の9時に実行"
        expression = "0 0 9 L * ?"
        timezone = "Asia/Tokyo"
      }
    }
  }
}

など、いろいろ設定できます。
expressionにcron形式で書いていくのですが、もっと複雑な設定をしたい場合もあるかと思います。
ここに書き方が載っているので、参考にすると良いです。

2.Actorを用意

akka-quartz-schedulerはAkkaを使っているので、ここでは簡単なActorを用意します

class SampleActor extends Actor {

  def receive = {
    case msg: String => println(msg)
  }

}

3.Globalオブジェクトを用意

今回はアプリケーションをスタートさせた時にスケジュールを実行させるため、
GlobalオブジェクトのonStart()メソッドを使って5秒毎に実行するスケジューラーを呼び出します。

object Global extends GlobalSettings {

  val system = ActorSystem("SampleSystem")
  val actor = system.actorOf(Props(classOf[SampleActor]))

  override def onStart(app: Application) = {
    // どのスケジュールを実行するか、どのアクターにメッセージを送信するか、どういうメッセージを送信するかを指定する
    QuartzSchedulerExtension(system).schedule("Every5Seconds", actor, "5秒")
  }

  override def onStop(app: Application) = {
    system.shutdown()
  }

}

4.実行

以上で準備が終わったので、さっそく実行してみましょう!
activator runで起動した際、onStart()メソッドが呼ばれるのはhttp://localhost:9000にアクセスしたタイミング。
beforeStart()メソッドも同じタイミングでした。

$ activator run

さて、コンソールを見てみると、実際に5秒毎にメッセージが出力されているのが確認できます。

[info] - play.api.libs.concurrent.ActorSystemProvider - Starting application default Akka system: application
[INFO] [07/11/2015 01:39:44.487] [ForkJoinPool-1-worker-1] [[QuartzScheduler~Sample]] Setting up scheduled job 'EveryFiveSeconds', with 'com.typesafe.akka.extension.quartz.QuartzCronSchedule@c7d42d6'
[info] - play.api.Play - Application started (Dev)
5秒
5秒

5.まとめ

以上のように、akka-quartz-schedulerを使うことで指定した時間に実行するプログラムを作ることができました。

これを使うことで、指定した時間にチャットアプリにメッセージを投稿したり、バッチを実行したりと応用できますね!

39
29
1

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
39
29