найти, если работа выполняется в Quartz1.6 - PullRequest
12 голосов
/ 06 февраля 2012

Я хотел бы уточнить детали метода 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");
    }               
}

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

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.

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

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

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

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

Спасибо!

Марина

1 Ответ

18 голосов
/ 08 февраля 2012

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

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

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

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");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...