Spring Batch中的MapJobRepositoryFactoryBean使用基于Jdbc的Daos,而不是基于Map的

时间:2017-04-19 09:13:45

标签: java spring spring-boot spring-batch

我正在实现一个小型REST服务,它运行批处理作业。我不会坚持任何元数据,我的工作不平行,所以我选择了MapJobRepositoryFactoryBean。而且我在类路径中也有H2用于其他目的。但是当我尝试运行该作业时,我收到以下错误:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

我发现,我从MapJobRepositoryFactoryBean获取的JobRepository bean使用 JdbcJobExecutionDao 而不是 MapJobExecutionDao 。因此,它根据要求失败

SELECT VERSION FROM BATCH_JOB_EXECUTION WHERE JOB_EXECUTION_ID=?

为什么会这样?我应该如何正确配置它以使用基于地图的Dao?

目前我的配置如下:

public class ServiceConfiguration {

@Bean
public PlatformTransactionManager transactionManager() {
    return new ResourcelessTransactionManager();
}

@Bean
public MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean(PlatformTransactionManager transactionManager) throws Exception {
    MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
    return  mapJobRepositoryFactoryBean;
}

@Bean(name = "inMemoryJobRepository")
public JobRepository jobRepository(MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean) throws Exception {
    JobRepository mapJobRepository = mapJobRepositoryFactoryBean.getObject();
    return mapJobRepository;
}

@Bean(name = "syncJobLauncher")
public JobLauncher jobLauncher(@Qualifier("inMemoryJobRepository") JobRepository jobRepository) throws Exception {
    SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
    simpleJobLauncher.setJobRepository(jobRepository);

    return simpleJobLauncher;
}
}

更新:

正如Michael Minella所提到的,应该创建自定义BatchConfigurer的bean。

@Bean
public BatchConfigurer batchConfigurer(@Qualifier("inMemoryJobRepository") JobRepository jobRepository,
                                        @Qualifier("syncJobLauncher") JobLauncher jobLauncher,
                                        @Qualifier("resourcelessTransactionManager") PlatformTransactionManager transactionManager,
                                        @Qualifier("inMemoryJobExplorer") JobExplorer jobExplorer){

    return new InMemoryBatchConfigurer(jobRepository, transactionManager, jobLauncher, jobExplorer);
}

0 个答案:

没有答案