はじめに
相変わらずツマラナイサンプルですが、社内の人に向けて書いてみました。
quartz APIについての情報が少ないのでまとめておきます。
基本的なこと
quartzにはJOBとTriggerという概念があります。
- JOB実行したい処理を書きます。JOBインタフェースをimplementsすればなんでもかけます。
- Triggerはスケジュールを表現するクラスです。cron expressionが使えますが、cronexpressionを使わずともAPIを使って同じことはできます。(今回は割愛)
- 上記のJOBとTriggerをScheduleインタフェースを使って操作します。
JOBとTriggerをまとめて登録
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder
.newJob(EbsSnapshotJob.class)
.withIdentity(EbsSnapshotJob.class.getSimpleName(),
Services.AWS.getName()).storeDurably().build();
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("12345", "4")
.withSchedule(
CronScheduleBuilder.cronSchedule("00 */20 * * * ?")
.inTimeZone(TimeZone.getTimeZone("Asia/Tokyo")))
.forJob(job).startNow().build();
scheduler.scheduleJob(job, trigger);
JOBの登録
ExamplesではJOBの登録とTriggerの登録を同時にするものしかありませんが、もちろんJOBのみの登録ができます。storeDurably()を設定しないとJOBのみの登録できません。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(EbsSnapshotJob.class)
.withIdentity(EbsSnapshotJob.class.getCanonicalName(), Services.AWS.getName())
.storeDurably()
.build();
scheduler.addJob(job,false);
JOBの削除
JOBの削除を行うにはJobKeyを設定し、deleteJobを呼び出します。
この時紐づくTriggerも全部消えてしまいますので使用には十分気をつけましょう。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobKey jobKey = new JobKey(EbsSnapshotJob.class.getSimpleName(), Services.AWS.getName());
scheduler.deleteJob(jobKey);
Triggerの登録を行う(JOBは存在)
TriggerにforJobを設定してあげれば良いです。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(EbsSnapshotJob.class)
.withIdentity(EbsSnapshotJob.class.getCanonicalName(), Services.AWS.getName())
.build();
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("12345", "4")
.withSchedule(
CronScheduleBuilder.cronSchedule("00 */10 * * * ?")
.inTimeZone(TimeZone.getTimeZone("Asia/Tokyo"))).forJob(job).startNow().build();
scheduler.scheduleJob(trigger);
Triggerの変更
rescheduleしてあげます。下記の例ではTriggerKeyのTriggerをCronTriggerで定義したものに置き換えています。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("12345", "4")
.withSchedule(
CronScheduleBuilder.cronSchedule("00 */20 * * * ?")
.inTimeZone(TimeZone.getTimeZone("Asia/Tokyo"))).forJob(job).startNow().build();
TriggerKey triggerKey = new TriggerKey("12345", "4");
scheduler.rescheduleJob(triggerKey, trigger);
Triggerの削除
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
TriggerKey triggerKey = new TriggerKey("12345", "4");
scheduler.unscheduleJob(triggerKey);