私は並列で実行したくないクォーツの2つのジョブインスタンスを持っています。以下の例のコードを単純化して、私の期待に沿わないものを示しました。Quartz @DisallowConcurrentExecutionが動作しません
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail job1 = newJob(TestJob.class).withIdentity("job1", "group1").build();
CronTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(new Date()).withSchedule(cronSchedule(getCronExpression(1))).build();
scheduler.scheduleJob(job1, trigger1);
JobDetail job2 = newJob(TestJob.class).withIdentity("job2", "group1").build();
CronTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(new Date()).withSchedule(cronSchedule(getCronExpression(1))).build();
scheduler.scheduleJob(job2, trigger2);
for (int i = 0; i < 5; i++) {
System.out.println(trigger1.getNextFireTime());
System.out.println(trigger2.getNextFireTime());
try {
Thread.sleep(1 * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static String getCronExpression(int interval) {
return "0 */" + interval + " * * * ?";
}
}
これは
@DisallowConcurrentExecution
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Job started");
System.out.println("Job sleeping 30s...");
try {
Thread.sleep(30 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Job finished.");
}
}
だからここで私は(実際のケースでは、一方が他方のすべての5分ごとに実行されている)毎分を実行するために、2つのジョブをスケジュールしていますし、これが出力されるジョブ・クラスであります私は取得しています:
Job started
Job sleeping 30s...
Job started
Job sleeping 30s...
Job finished.
Job finished.
だから、両方のジョブが並列に実行されている、JOB1が待機JOB2を実行する前に完了させるために、シーケンシャル順序が私にこのシーケンスを与えるため
Job started
Job sleeping 30s...
Job finished.
Job started
Job sleeping 30s...
Job finished.
なぜこのようなことは起こりませんか?ドキュメントから