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

環境


コード


依存ライブラリを追加。

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

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

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

後はコードを書くだけ。

1
package net.yoshinorin.actortest
2
3
import akka.actor.{Actor, ActorSystem, Props}
4
import scala.concurrent.duration._
5
6
object AkkaSchedulerTest extends App {
7
8
  val actorSystem = ActorSystem("TestActor")
9
  //classOfで書かないとダメ
10
  val testActor = actorSystem.actorOf(Props(classOf[GitHubEventActor]))
11
  val scheduler = QuartzSchedulerExtension(actorSystem)
12
13
  //第一引数にapplication.confで指定したキーを書く
14
  //またここではExecutionContextExecutorは要求されない
15
  scheduler.schedule("TestSchedule", testActor, Test)
16
17
}
18
19
case class Test()
20
21
class TestActor extends Actor {
22
23
  override def receive: Receive = {
24
    case Test => {
25
      println("test akka scheduler")
26
    }
27
  }
28
29
}

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

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

おわり。