Подтвердить что ты не робот

Найти, если задание выполняется в Quartz1.6

Я хотел бы уточнить детали метода scheduler.getCurrentlyExecutingJobs() в Quartz1.6. У меня есть работа, в которой должен работать только один экземпляр в любой момент. Он может быть запущен для "запускать сейчас" из пользовательского интерфейса, но если экземпляр задания уже запущен для этого задания - ничего не должно произойти.

Вот как я проверяю, есть ли работа, которая меня интересует:

    List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs();
    for (JobExecutionContext jobCtx: currentJobs){
    jobName = jobCtx.getJobDetail().getName();
    groupName = jobCtx.getJobDetail().getGroup();
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") &&
        groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) {
        //found it!
        logger.warn("the job is already running - do nothing");
    }               
}

то, чтобы проверить это, у меня есть unit test, который пытается запланировать два экземпляра этого задания один за другим. Я ожидал увидеть предупреждение при попытке запланировать вторую работу, однако вместо этого я получаю это исключение:

org.quartz.ObjectAlreadyExistsException: Unable to store Job with name:
 'job_I_am_looking_for_name' and group: 'job_group_I_am_looking_for_name', 
 because one already exists with this identification.

Когда я запускаю этот unit test в режиме отладки, с разрывом в этой строке:

Список currentJobs = scheduler.getCurrentlyExecutingJobs();

Я вижу, что список пуст, поэтому планировщик не видит это задание как запущенное, но ему все еще не удается запланировать его снова, что говорит мне, что работа действительно выполнялась в то время...

Я пропустил некоторые тонкие точки с помощью этого метода планировщика?

Спасибо!

Марина

4b9b3361

Ответ 1

В интересах других, я отправляю ответ на вопрос, который у меня был - я получил помощь от Terracotta Forum Zemian Deng: публикация на Terracotta форум

Вот повторная крышка: Разумеется, фактическая проверка рабочих заданий работала нормально - это было просто время в модульных тестах. Я добавил несколько спальных мест в задании и изменил модульные тесты, чтобы запланировать второе задание, пока первый из них все еще работает, и подтвердил, что действительно могу найти первое задание, которое все еще выполняется.

Исключением, которое я получал, было то, что я пытался запланировать новое задание с тем же именем, вместо того, чтобы пытаться запустить уже сохраненное в задании планировщика. Следующий код работал точно так, как мне было нужно:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs();
for (JobExecutionContext jobCtx: currentJobs){
    jobName = jobCtx.getJobDetail().getName();
    groupName = jobCtx.getJobDetail().getGroup();
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) {
        //found it!
        logger.warn("the job is already running - do nothing");
                 return;
    }               
}
      // check if this job is already stored in the scheduler
JobDetail emailJob;
emailJob = scheduler.getJobDetail("job_I_am_looking_for_name", "job_group_I_am_looking_for_name");
if (emailJob == null){
       // this job is not in the scheduler yet
  // create JobDetail object for my job 
  emailJob = jobFactory.getObject();
  emailJob.setName("job_I_am_looking_for_name");
  emailJob.setGroup("job_group_I_am_looking_for_name");
  scheduler.addJob(emailJob, true);             
}

// this job is in the scheduler and it is not running right now - run it now
scheduler.triggerJob("job_I_am_looking_for_name", "job_group_I_am_looking_for_name");

Спасибо! Марина