我正在使用Spring启动测试Spring Batch。我需要定义在Oracle数据库上工作的作业,但我不想在此数据库中保存作业和步骤状态。 我已经在文档中读到了我可以使用MapJobRepositoryFactoryBean的内存存储库。
然后,我实现了这个bean:
@Bean
public JobRepository jobRepository() {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
try {
JobRepository jobRepository = factoryBean.getObject();
return jobRepository;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
但是当我的工作开始时,Spring Batch的第一件事就是在Oracle DB中创建表并继续使用Oracle数据源。就像我的JobRepository定义没有被考虑在内一样。
我错过了什么?
编辑:我使用的是Spring Boot 1.5.3和Spring Batch 3.0.7
答案 0 :(得分:7)
这里有一些事情:
DataSource
中配置了ApplicationContext
,默认情况下,Spring Batch会尝试使用它。DataSource
内无法使用ApplicationContext
时,您需要创建自己的BatchConfigurer
。您可以通过扩展DefaultBatchConfigurer
。MapJobRepository
,但仅用于测试目的。我有许多问题(线程安全等),不建议用于生产。使用内存数据库(如HSQLDB)(您仍然需要创建自己的BatchConfigurer
)。答案 1 :(得分:4)
使用SpringBoot 2.x,解决方案更简单。
您必须像这样扩展DefaultBatchConfigurer
类:
@Component
public class NoPersistenceBatchConfigurer extends DefaultBatchConfigurer {
@Override
public void setDataSource(DataSource dataSource) {
}
}
在没有数据源的情况下,框架会自动切换为使用MapJobRepository
。
答案 2 :(得分:3)
感谢pvpkiran的评论我发现了我的问题。定义JobLauncher bean是必要的。
以下示例:
@Bean
public JobRepository jobRepository() {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
try {
JobRepository jobRepository = factoryBean.getObject();
return jobRepository;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
答案 3 :(得分:0)
如果使用Spring Boot和@EnableBatchProcessing,则将扩展DefaultBatchConfigurer并覆盖createJobRepository方法。使用MapJobRepositoryFactoryBean创建ResourcelessTransactionManager和JobRepository,其余的bean将由Spring Boot自动创建。
@Configuration
public class InMemoryBatchContextConfigurer extends DefaultBatchConfigurer {
@Bean
private ResourcelessTransactionManager resoucelessTransactionManager() {
return new ResourcelessTransactionManager();
}
@Override
protected JobRepository createJobRepository() throws Exception {
MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean();
factoryBean.setTransactionManager(resoucelessTransactionManager());
return factoryBean.getObject();
}
}`