почему кварц scheduleJob () выполняется много раз? - PullRequest
0 голосов
/ 03 января 2019
public class QuartzStudy implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
    System.out.println(jobExecutionContext.getJobDetail().getKey().getName() + "-" + Thread.currentThread().getName() + "-" + Thread.currentThread().getId() + "-" + new Date());
}

private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
private static Scheduler scheduler;
static {
    try {
        scheduler = schedulerFactory.getScheduler();
        scheduler.start();
    } catch (SchedulerException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws SchedulerException, InterruptedException {
    JobDetail jobDetail = JobBuilder.newJob(QuartzStudy.class).withIdentity("job1").build();
    CronTrigger trigger = TriggerBuilder.newTrigger()
            .withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?").withMisfireHandlingInstructionIgnoreMisfires())
            .build();
    scheduler.scheduleJob(jobDetail, trigger);
    Thread.sleep(10000);
    scheduler.pauseJob(jobDetail.getKey());
}

}

Этот код должен утешить дважды, а затем сделать паузу?

Но иногда утешает три раза, почему?

job1-DefaultQuartzScheduler_Worker-1-14-Чт 03 января 09:34:45 CST 2019

job1-DefaultQuartzScheduler_Worker-2-15-Thu Jan 03 09:34:50 CST 2019

job1-DefaultQuartzScheduler_Worker-3-16-Чт 03 января 09:34:55 CST 2019

1 Ответ

0 голосов
/ 03 января 2019

Прежде всего, */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!!!");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...