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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^

コメント