java - 如何在 Spring 管理中使用 JobLauncher Synchronizer

标签 java spring-boot spring-batch

有一个@Aspect可以确保Spring Boot中的作业不可重入。它在 JobLauncherSynchronizer.java 中实现并记录here 。它位于 Spring Batch 管理工件中。

我的作业是通过 @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();
}

最佳答案

您可以做的是覆盖 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) 中完成,因此我们仅在此处添加双重检查。

关于java - 如何在 Spring 管理中使用 JobLauncher Synchronizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824266/

相关文章:

java - 如何避免溢出变量的乘法?

用于匿名类的 Java 8 Lambda

java - Andengine 中 Sprite 闪烁

java - 如何检查我的数组是否与原始数组不同?

java - 如何在 Spring Boot 单元测试中模拟 JWT 身份验证?

java - 如何在PreparedStatement中使用自动生成的@Id?

spring - 已解决由 Handler 执行引起的异常 : org. springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form

java - 需要配置类中的属性

java - Spring批处理spring jpa错误CannotCreateTransactionException : Could not open JPA EntityManager for transaction IllegalStateException:

java - Spring Batch 决策者没有重复