JavaのQuartzライブラリで定義したジョブを定期的に実行する方法
Quartzライブラリを使ってジョブを定期的に実行することができます。Spring Batchでも似たことが可能です。
build.gradle
dependencies { implementation 'org.quartz-scheduler:quartz:2.3.2' }
現時点で2.3.2が最新なので、バージョンは2.3.2で依存関係を解決します。
ジョブクラス作成
最初にジョブクラスを作成します。ジョブクラスはorg.quartz.Job
インタフェースをimplementsする必要があります。
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>です。
JobDetail job = JobBuilder.newJob(AJob.class).withIdentity("job1", "group1").build();
withIdentityの引数はJobKeyインスタンスでもよいです。
JobKey key = new JobKey("job1", "group1"); JobDetail job = JobBuilder.newJob(AJob.class).withIdentity(key).build();
Triggerクラスのインスタンス生成
TriggerBuilder.newTrigger()
メソッドでTriggerBuilderクラスのインスタンス生成します。
メソッドチェーンでwithIdentity("トリガー名", "所属グループ名")
、startNow()
メソッドとするとジョブを登録後、そのジョブを即時実行します。
withSchedule()
メソッドの引数に以下のように指定します。
SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(1000) // 1秒間隔 .repeatForever() // 1秒ごとに永遠に繰り返す
このメソッドをチェーンしてTriggerインスタンス生成をします。
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(1000) // 100ミリ秒間隔 .repeatForever()) // 処理をずっと繰り返す .build();
Schedulerクラスのインスタンス生成
Schedulerクラスのインスタンス生成はStdSchedulerFactory.getDefaultScheduler()メソッドで生成します。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
ジョブ登録
SchedulerインスタンスのscheduleJobメソッドに引数を渡してジョブ登録します。
第一引数 | 第二引数 |
---|---|
Jobのインスタンス | Triggerのインスタンス |
start()とshutdown()
ジョブを実行するにはorg.quartz.Scheduler
をstart()メソッドでスタートさせます。
終了するにはshutdown()メソッドを実行します。
このstart~shutdownの間にジョブを実行することができます。
その為以下ではThread.sleep(10000);
で10秒スリープさせています。
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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント