Quartzでcronを範囲検索したい
2016-7-23
第十六回 #渋谷java
自己紹介
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
GitBucketやってます
https://github.com/gitbucket/gitbucket
直近の著書です →
Do you know Quartz ?
What’s Quartz
Javaのジョブスケジューリングライブラリ
最新は2.2.3 (16.7.18時点)
プログラムから登録したジョブを任意の時間に動かせる
Schedule
SimpleTrigger
特定の時間に一度だけ起動するジョブ
ある期間に繰り返し実行するジョブ
SimpleTrigger
val trigger = TriggerBuilder.newTrigger
.withIdentity("key")
.startAt(DateBuilder
.futureDate(5, IntervalUnit.MINUTE))
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(10))
.build
5分後に起動
10秒ごとに10回繰り返す
Today's topic is ...
Schedule
CronTrigger
ジョブのスケジュールをCron Expressionsで指定
APIを使うことも可能
CronTrigger
val trigger = TriggerBuilder.newTrigger
.withIdentity("key")
.withSchedule(CronScheduleBuilder
.cronSchedule("0 42 10 * * ?")
.inTimeZone(getTimeZone("UTC"))
.build
毎日AM10:42に起動
I wanna do
Cronで設定したジョブが数千個ある
タイムゾーンもバラバラ
「JST 13-15時に起動するジョブを知りたい」というケースが出てきた
Cronを検索したい!!
Example
JST 13時から15時の間に起動するジョブを知りたい!
// 入力値
val input1 = "2016-07-23 13:00:00"
val input2 = "2016-07-23 15:00:00"
Example
// このcronが条件にあてはまるか?
val cron = "0 30 4 * * ?"
val timezone = "UTC"
val expression = new CronExpression(cron)
expression.setTimeZone(
TimeZone.getTimeZone(timezone))
Example
// 入力値をjava.util.Dateに変換
val format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss")
format.setTimeZone(
TimeZone.getTimeZone("JST"))
Example
val from = new Date(
format.parse(input1).getTime - 1000)
val to = format.parse(input2)
// 次にfireする時間を返す
val res = expression.getTimeAfter(from)
// toの時間までに起動するか
res.getTime <= to.getTime
13時ちょうどに起動するもの
も含める
Point
org.quartz.CronExpressionのgetTimeAfterメソッド
指定した日時より後に、cron式を満たす次の日時を返す
How to get all triggers
Schedulerに登録したトリガーから調べるには?
1. getTriggerKeysでkeyの一覧を取得
2. getTrigger(TriggerKey)でトリガーを取得
3. トリガーからCron ExpressionとTimeZoneが取れる
How to get all triggers
val keys = scheduler.getTriggerKeys(
GroupMatcher.anyTriggerGroup())
keys.asScala.foreach { key =>
val trigger = scheduler.getTrigger(key)
.asInstanceOf[CronTrigger]
trigger.getCronExpression // "0 30 4 * * ?"
trigger.getTimeZone.getID // "UTC"
}
Conclusion
Conclusion
Cronでスケジュールした時間の範囲検索は少し面倒
Quartzはjava.util.Date、java.util.TimeZoneベース
もっといいやり方があれば教えてください

Quartzでcronを範囲検索したい