19
Quartzcronを範囲検索したい 2016-7-23 第十六回 #渋谷java

Quartzでcronを範囲検索したい

Embed Size (px)

Citation preview

Page 1: Quartzでcronを範囲検索したい

Quartzでcronを範囲検索したい

2016-7-23第十六回 #渋谷java

Page 2: Quartzでcronを範囲検索したい

自己紹介

島本 多可子(@chibochibo03)

株式会社ビズリーチ CTO室

普段はScalaを書いてます

GitBucketやってます

https://github.com/gitbucket/gitbucket

直近の著書です →

Page 3: Quartzでcronを範囲検索したい

Do you know Quartz ?

Page 4: Quartzでcronを範囲検索したい

What’s QuartzJavaのジョブスケジューリングライブラリ

最新は2.2.3 (16.7.18時点)

プログラムから登録したジョブを任意の時間に動かせる

Page 5: Quartzでcronを範囲検索したい

ScheduleSimpleTrigger

特定の時間に一度だけ起動するジョブ

ある期間に繰り返し実行するジョブ

Page 6: Quartzでcronを範囲検索したい

SimpleTrigger

val trigger = TriggerBuilder.newTrigger .withIdentity("key") .startAt(DateBuilder .futureDate(5, IntervalUnit.MINUTE)) .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(10) .withRepeatCount(10)) .build

5分後に起動10秒ごとに10回繰り返す

Page 7: Quartzでcronを範囲検索したい

Today's topic is ...

Page 8: Quartzでcronを範囲検索したい

ScheduleCronTrigger

ジョブのスケジュールをCron Expressionsで指定

APIを使うことも可能

Page 9: Quartzでcronを範囲検索したい

CronTrigger

val trigger = TriggerBuilder.newTrigger .withIdentity("key") .withSchedule(CronScheduleBuilder .cronSchedule("0 42 10 * * ?") .inTimeZone(getTimeZone("UTC")) .build

毎日AM10:42に起動

Page 10: Quartzでcronを範囲検索したい

I wanna doCronで設定したジョブが数千個ある

タイムゾーンもバラバラ

「JST 13-15時に起動するジョブを知りたい」というケースが出てきた

Cronを検索したい!!

Page 11: Quartzでcronを範囲検索したい

ExampleJST 13時から15時の間に起動するジョブを知りたい!

// 入力値

val input1 = "2016-07-23 13:00:00"val input2 = "2016-07-23 15:00:00"

Page 12: Quartzでcronを範囲検索したい

Example

// このcronが条件にあてはまるか?

val cron = "0 30 4 * * ?"val timezone = "UTC"

val expression = new CronExpression(cron)expression.setTimeZone( TimeZone.getTimeZone(timezone))

Page 13: Quartzでcronを範囲検索したい

Example

// 入力値をjava.util.Dateに変換

val format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss")format.setTimeZone( TimeZone.getTimeZone("JST"))

Page 14: Quartzでcronを範囲検索したい

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時ちょうどに起動するものも含める

Page 15: Quartzでcronを範囲検索したい

Pointorg.quartz.CronExpressionのgetTimeAfterメソッド

指定した日時より後に、cron式を満たす次の日時を返す

Page 16: Quartzでcronを範囲検索したい

How to get all triggersSchedulerに登録したトリガーから調べるには?

1. getTriggerKeysでkeyの一覧を取得

2. getTrigger(TriggerKey)でトリガーを取得

3. トリガーからCron ExpressionとTimeZoneが取れる

Page 17: Quartzでcronを範囲検索したい

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"}

Page 18: Quartzでcronを範囲検索したい

Conclusion

Page 19: Quartzでcronを範囲検索したい

ConclusionCronでスケジュールした時間の範囲検索は少し面倒

Quartzはjava.util.Date、java.util.TimeZoneベース

もっといいやり方があれば教えてください