JavaのQuartzライブラリで定義したジョブを定期的に実行する方法
Quartzライブラリを使ってジョブを定期的に実行することができます。Spring Batchでも似たことが可能です。
build.gradle
1 2 3 |
dependencies { implementation 'org.quartz-scheduler:quartz:2.3.2' } |
現時点で2.3.2が最新なので、バージョンは2.3.2で依存関係を解決します。
ジョブクラス作成
最初にジョブクラスを作成します。ジョブクラスはorg.quartz.Job
インタフェースをimplementsする必要があります。
1 2 3 4 5 6 7 8 9 10 11 |
package jp.co.confrage; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class AJob implements org.quartz.Job { // 必ずimplementsする @Override public void execute(final JobExecutionContext context) throws JobExecutionException { System.out.println("AJob execute."); } } |
これで標準出力するAJobクラスを作成しました。
JobDetailクラスのインスタンス生成
JobBuilderクラスからJobDetailクラスのインスタンスを生成します。newJobメソッドの引数はClass <? extends Job>です。
1 |
JobDetail job = JobBuilder.newJob(AJob.class).withIdentity("job1", "group1").build(); |
withIdentityの引数はJobKeyインスタンスでもよいです。
1 2 |
JobKey key = new JobKey("job1", "group1"); JobDetail job = JobBuilder.newJob(AJob.class).withIdentity(key).build(); |
Triggerクラスのインスタンス生成
TriggerBuilder.newTrigger()
メソッドでTriggerBuilderクラスのインスタンス生成します。
メソッドチェーンでwithIdentity("トリガー名", "所属グループ名")
、startNow()
メソッドとするとジョブを登録後、そのジョブを即時実行します。
withSchedule()
メソッドの引数に以下のように指定します。
1 2 3 |
SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(1000) // 1秒間隔 .repeatForever() // 1秒ごとに永遠に繰り返す |
このメソッドをチェーンしてTriggerインスタンス生成をします。
1 2 3 4 5 6 7 8 9 |
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(1000) // 100ミリ秒間隔 .repeatForever()) // 処理をずっと繰り返す .build(); |
Schedulerクラスのインスタンス生成
Schedulerクラスのインスタンス生成はStdSchedulerFactory.getDefaultScheduler()メソッドで生成します。
1 |
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); |
ジョブ登録
SchedulerインスタンスのscheduleJobメソッドに引数を渡してジョブ登録します。
第一引数 | 第二引数 |
---|---|
Jobのインスタンス | Triggerのインスタンス |
start()とshutdown()
ジョブを実行するにはorg.quartz.Scheduler
をstart()メソッドでスタートさせます。
終了するにはshutdown()メソッドを実行します。
このstart~shutdownの間にジョブを実行することができます。
その為以下ではThread.sleep(10000);
で10秒スリープさせています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package jp.co.confrage; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class Library { public static void main(final String[] args) { JobDetail job = JobBuilder.newJob(AJob.class).withIdentity("job", "group").build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger", "group") .startNow() .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(1000) // 1秒間隔 .repeatForever()) // 処理をずっと繰り返す .build(); try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); // スタート Thread.sleep(10000); // 10秒スリープ scheduler.shutdown(); // エンド } catch (SchedulerException | InterruptedException e) { throw new RuntimeException(e); } } } |
次回、org.quartz.JobListener
を使ってJobを監視します。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^