Upload
chibochibo
View
182
Download
2
Embed Size (px)
Citation preview
Quartzでcronを範囲検索したい
2016-7-23第十六回 #渋谷java
自己紹介
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
GitBucketやってます
https://github.com/gitbucket/gitbucket
直近の著書です →
Do you know Quartz ?
What’s QuartzJavaのジョブスケジューリングライブラリ
最新は2.2.3 (16.7.18時点)
プログラムから登録したジョブを任意の時間に動かせる
ScheduleSimpleTrigger
特定の時間に一度だけ起動するジョブ
ある期間に繰り返し実行するジョブ
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 ...
ScheduleCronTrigger
ジョブのスケジュールをCron Expressionsで指定
APIを使うことも可能
CronTrigger
val trigger = TriggerBuilder.newTrigger .withIdentity("key") .withSchedule(CronScheduleBuilder .cronSchedule("0 42 10 * * ?") .inTimeZone(getTimeZone("UTC")) .build
毎日AM10:42に起動
I wanna doCronで設定したジョブが数千個ある
タイムゾーンもバラバラ
「JST 13-15時に起動するジョブを知りたい」というケースが出てきた
Cronを検索したい!!
ExampleJST 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時ちょうどに起動するものも含める
Pointorg.quartz.CronExpressionのgetTimeAfterメソッド
指定した日時より後に、cron式を満たす次の日時を返す
How to get all triggersSchedulerに登録したトリガーから調べるには?
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
ConclusionCronでスケジュールした時間の範囲検索は少し面倒
Quartzはjava.util.Date、java.util.TimeZoneベース
もっといいやり方があれば教えてください