JavaのQuartzライブラリで定義したジョブを定期的に実行する方法

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を監視します。

コメント

タイトルとURLをコピーしました