Как я могу использовать JobLauncherSynchronizer в весенний админ - PullRequest
0 голосов
/ 30 июня 2019

Существует @Aspect, который гарантирует, что задания при весенней загрузке не будут повторными.Он реализован в JobLauncherSynchronizer.java и задокументирован здесь .Он находится в административном артефакте весенней партии.

Моя работа создается через @Bean следующим образом:

@Bean
@Qualifier("synchronisationLauncher")
public JobLauncher synchronisationLauncher() throws Exception {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
    jobLauncher.afterPropertiesSet();
    return jobLauncher;
}

Мой вопрос:
как мне интегрировать@Aspect в мой JobLauncher?

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

Мой код запуска:

// dependencies from constructor.
// the launcher is qualified to 'synchronisationLauncher'
private JobLauncher launcher;
private Job mergeJob;
private JobQueryHelper jobQueryHelper;

@PostMapping("uri")
public ResponseEntity<APIResponse> SynchroniseRetailers()
        throws JobParametersInvalidException,
               JobExecutionAlreadyRunningException,
               JobRestartException,
               JobInstanceAlreadyCompleteException {

    JobParametersBuilder builder = new JobParametersBuilder()
            .addLong("run.id", jobQueryHelper.findLastBatchExecutionIndex() + 1);
    launcher.run(mergeJob, builder.toJobParameters());
    return buildEmptyResponse();
}

1 Ответ

0 голосов
/ 02 июля 2019

Что вы можете сделать, это переопределить метод SimpleJobLauncher#run и добавить двойную проверку перед запуском задания:

@Bean
public JobLauncher jobLauncher(JobRepository jobRepository, JobExplorer jobExplorer) {
    SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher() {
        @Override
        public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
            Set<JobExecution> running = jobExplorer.findRunningJobExecutions(job.getName());
            if (!running.isEmpty()) {
                throw new JobExecutionAlreadyRunningException("An instance of this job is already active: " + job.getName());
            }
            return super.run(job, jobParameters);
        }
    };
    simpleJobLauncher.setJobRepository(jobRepository);
    simpleJobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
    simpleJobLauncher.afterPropertiesSet();
    return simpleJobLauncher;
}

Обратите внимание, что это похоже на код в аспекте, которым вы поделились, но без необходимости какого-либо AOP. Как я уже упоминал в комментарии, эта проверка уже выполнена в super.run(job, jobParameters), поэтому мы добавляем здесь только двойную проверку.

Надеюсь, это поможет.

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