Прежде всего, */5 * * * * ?
означает Every 5 seconds starting at :00 second after the minute
.
Вы делаете Thread.sleep(10000);
. Это означает, что main thread
будет приостановлено на 10 секунд. Но, поскольку вы получаете журналы даже в течение этих 10 секунд, это означает, что планировщик не зависит от main thread
. Таким образом, на 10-й секунде планировщик создаст поток для запуска execute
, а также через 10-ю секунду вы приостанавливаете job
. Если первый (т. Е. Создание потока происходит раньше pausing
), сначала будут напечатаны журналы трижды. Принимая во внимание, что если второй (pausing
из job
встречается раньше, чем spawning
новый поток) появляется первым, журналы будут напечатаны только дважды. Вот почему иногда журнал печатается дважды, а иногда трижды.
Итак, чтобы быть уверенным, что журналы печатаются только дважды, уменьшите время ожидания до 9 секунд. Я попробовал приведенный ниже код, и он всегда печатает логи дважды:
public static void main(String[] args) throws SchedulerException, InterruptedException {
System.out.println("Main method:" + Thread.currentThread().getName() + "-" + Thread.currentThread().getId());
JobDetail jobDetail = JobBuilder.newJob(QuartzStudy.class).withIdentity("job1").build();
CronTrigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?").withMisfireHandlingInstructionIgnoreMisfires())
.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start(); // it's better to start job once you have scheduled one
Thread.sleep(9000);
scheduler.pauseJob(jobDetail.getKey());
System.out.println("Job is Paused!!!");
}