Ваша работа должна знать, какой файл обрабатывать, прежде чем он будет выполнен.Например, имя файла должно быть передано в качестве параметра задания.Удалите JobExecutionListener
и добавьте StepExecutionListener
для доступа к параметрам задания через StepExecution#getJobParameters()
.Одно задание = один файл.
Теперь из вашего планировщика вы хотите убедиться, что в один момент времени выполняется только одно задание.Вы можете достичь этого двумя способами:
• Использование исполнителя асинхронных задач.В этом случае каждый раз, когда вы запускаете задание, оно не будет выполняться в фоновом режиме (если ваш планировщик не запускает события таймера каждый раз в новом потоке).
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor" ref="taskExecutor" />
</bean>
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
• Если вы используете одно и то же заданиедля запуска других заданий, которые должны выполняться в фоновом режиме, вам нужно использовать ThreadPoolTaskExecutor
, но вы можете вручную проверить, выполняется ли задание:
for (final JobInstance jobInstance : jobExplorer.getJobInstances(jobName(), 0, LOOK_BEHIND_INSTANCES)) {
for (final JobExecution jobExecution : jobExplorer.getJobExecutions(jobInstance)) {
final BatchStatus status = jobExecution.getStatus();
if (status.isRunning()) {
// Ops:
break;
}
}
}