Как предотвратить выполнение запланированного задания в весеннем пакете, если предыдущее задание все еще выполняется? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь смоделировать сценарий, в котором, выполняя Thread.sleep () в считывателе, но даже если текущее запущенное задание не завершает, другое задание передается в пул потоков, как я могу предотвратить это?

@Scheduled(fixedRate = 100)
public void executeChunkJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
    executeJob(chunkJob);
}

private void executeJob(Job jobToRun) throws JobParametersInvalidException, JobExecutionAlreadyRunningException,
        JobRestartException, JobInstanceAlreadyCompleteException{
    try {
        JobParameters parameters = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis())).toJobParameters();

        JobExecution jobExecution = jobLauncher().run(jobToRun, parameters);
        System.out.println("JOb Execution" + jobExecution.getExitStatus());
    } catch(JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException | JobParametersInvalidException e) {
        throw e;
    } catch(OutOfMemoryError | Exception e) {
    }
}

@Bean
public JobLauncher jobLauncher() throws Exception
{
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();

    jobLauncher.setJobRepository(jobRepository);
    jobLauncher.setTaskExecutor(getCustomTaskExecutor());
    jobLauncher.afterPropertiesSet();

    return jobLauncher;
}

@Bean(name= "myExecutor")
public TaskExecutor getCustomTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(100);
    executor.initialize();
    return executor;
}```

1 Ответ

0 голосов
/ 24 апреля 2020

Вы можете найти условия выполнения задания, если в случае запуска задания с тем же именем задания.

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

Нам нужно автоматически подключить JobExplorer,

@Autowired
JobExplorer jobExplorer;

Фрагмент метода для справки,

for (JobExecution jobExecution : jobExecutionsSet) {

   if (jobExecution.getStatus() != BatchStatus.STARTED || jobExecution.getStatus() != BatchStatus.STARTING) {
       // start the new job
   } else {
       // prevent it from starting
   }
}
...