Как найти какое-либо из ранее запущенных заданий / задач, которые не выполняются в весенней партии? Я пробовал какой-то код, но не уверен

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

Проблема, с которой я сталкиваюсь, заключается в том, что иногда может быть огромный объем данных, который может потребовать выполнения задания более 10 минут. В таких случаях я хочу определить, выполняется ли какое-либо задание или нет? Если нет, то только я сделаю повторный запуск нового экземпляра задания. Если это задание уже запущено, я бы пропустил «вызов нового экземпляра задания». У меня есть код, который выглядит следующим образом.

Job job = (Job) context.getBean("job");

JobExplorer explorer = (JobExplorer) context.getBean("jobExplorer");

// Fetching all job instances.
List<JobInstance> jobInstances = explorer.findJobInstancesByJobName(
        job.getName(), 0, explorer.getJobInstanceCount(job.getName()));

// Fetching the last job instance.
JobInstance lastJobInstance = jobInstances.get(0);

//Obtain all executions for last job instance.
List<JobExecution> executions = explorer.getJobExecutions(lastJobInstance);

// fetching last job execution
JobExecution lastJobExecution = executions.get(0);

System.out.println("Is my last Job running? \nAns:"+lastJobExecution.isRunning());

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

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

P.S. Экземпляр задания и jObExplorer и jobLauncher внедряются внутрь планировщика. Это просто похожий код и, следовательно, получение bean-компонентов с использованием контекста.

Спасибо за чтение.


person Bilbo Baggins    schedule 07.03.2015    source источник
comment
JobExplorer.findRunningJobExecutions() ?   -  person Luca Basso Ricci    schedule 10.03.2015
comment
@LucaBassoRicci спасибо за ответ, я нашел API. Но я хочу знать, что в моем случае я использую тасклет, что, если я использую программирование на основе фрагментов, будет ли работать тот же подход с другим вызовом (о котором вы упомянули)? Почему я это спрашиваю? потому что для чанка также будет другой контекст выполнения. Пожалуйста, поправьте меня, если я ошибаюсь или чего-то не хватает :) :) :)   -  person Bilbo Baggins    schedule 10.03.2015
comment
Еще одна вещь. Это то, что есть в документах: Извлечение запущенных заданий. Выполнение соответствующих шагов может быть не полностью гидратировано (например, их контекст выполнения может отсутствовать), в зависимости от реализации. В этом случае используйте getStepExecution(Long, Long), чтобы увлажнить их. Я не получил это много.   -  person Bilbo Baggins    schedule 10.03.2015


Ответы (1)


Если вы используете планировщик, у вас, вероятно, должен быть класс JobLauncherDetails, в который вы можете добавлять такие параметры, как

JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);

и один из этих параметров может быть вашим последним временем выполнения, добавьте параметр dateTime к этой карте и используйте экземпляр JobCompletionReader

jobCompletionReader.getLastCompleteDate()

сравните это с 10 минутами ранее, посмотрите, закончили ли вы «работу 10 минут назад». что-то подобное должно работать для вас.

person Shilan    schedule 07.04.2015