AkkaのActorをスケジュール実行する

Typesafeで開発されているAkkaの拡張機能の1つにakka-quartz-schedulerというものがあります。
https://github.com/typesafehub/akka-quartz-scheduler

これはQuartzを使って指定したタイミングでActorを起動することができるというものです。Playなどに組み込んでバッチ処理を動かすといった用途にも利用できます。

まずはbuild.sbtに以下の依存関係を追加。akka-quartz-schedulerのバージョンは使っているAkkaのバージョンによって変える必要があります。

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe.akka" %% "akka-quartz-scheduler" % "1.2.0-akka-2.2.x"

スケジュールはapplication.confに書いておきます。Quartzのcron形式の記述が使えます。

akka {
  quartz {
    schedules {
      Every15Seconds {
        description = "15秒おきに実行"
        expression = "0,15,30,45 * * ? * *"
      }
    }
  }
}

使い方はこんな感じ。Playに組み込む場合はGlobalに書いておくのがよいと思います。schedule()メソッドの第一引数はapplication.confで定義したスケジュールとあわせておく必要があります。

import com.typesafe.akka.extension.quartz.QuartzSchedulerExtension

// スケジューラを生成
val scheduler = QuartzSchedulerExtension(_system)

// アクターをスケジューリング
scheduler.schedule(
  "Every15Seconds",                       // アクターの名前
  Akka.system.actorOf(Props[HelloActor]), // ActorRef
  "Hello"                                 // アクターに送信するメッセージ
)

スケジュールを事前に設定ファイルに書いておかないといけないので、動的にスケジュールを設定できるようにする必要のある用途にはちょっと使いにくいです(不可能ではありませんが)。そういう場合にはakka-quartzのほうがいいかもしれません。