昨日、Akka Schedulerのみで定期実行する記事を書いたのですが、今度はakka-quartz-schedulerを使ってやってみました。

環境


コード


依存ライブラリを追加。

1
libraryDependencies += "com.enragedginger" %% "akka-quartz-scheduler" % "1.7.1-akka-2.5.x",

次にapplication.confに設定を書く。書き方はこちら。例えば下記の場合だと1分に一度実行するように指定している。

1
2
3
4
5
6
7
8
9
10
akka {
quartz {
defaultTimezone = "Asia/Tokyo"
schedules {
TestSchedule {
expression = "0 0/1 * * * ?"
}
}
}
}

後はコードを書くだけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package net.yoshinorin.actortest

import akka.actor.{Actor, ActorSystem, Props}
import scala.concurrent.duration._

object AkkaSchedulerTest extends App {

val actorSystem = ActorSystem("TestActor")
//classOfで書かないとダメ
val testActor = actorSystem.actorOf(Props(classOf[GitHubEventActor]))
val scheduler = QuartzSchedulerExtension(actorSystem)

//第一引数にapplication.confで指定したキーを書く
//またここではExecutionContextExecutorは要求されない
scheduler.schedule("TestSchedule", testActor, Test)

}

case class Test()

class TestActor extends Actor {

override def receive: Receive = {
case Test => {
println("test akka scheduler")
}
}

}

こんな感じ。ポイントとしては下記くらい。

  • actorOfにはclassOfで書く
    • ここでインスタンス生成(new ClassName)してしまうと「既に存在するActorです」見たいなエラーが出る
  • ExecutionContextExecutorを暗黙のパラメータとして要求しない
  • QuartzSchedulerExtension.scheduleにはapplication.confで指定したキーと同じ名前のものを指定する

おわり。