我正在实现一个小型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);
}