使用spring-data-jpa设置我的第一个spring-boot-batch项目。我在我的开发环境中有一个工作解决方案,我在我的itemReader中从Oracle DB中消耗了一些行,在我的处理器中为每一行解析一些xml / html,然后使用自定义将每个提取的html写出到单个文件中itemWriter。 (每行1个文件)
我的数据源是通过引导项目中的spring-data-jpa配置的(application.properties)......
我注意到OOTB spring-batch使用可用的数据源为其jobRepository创建了各种模式对象。
这在开发环境中很好,但我只在我们的生产Oracle DB环境中拥有“读取”访问权限,我的itemReader将获取其官方数据。
我尝试配置2个数据源,如我遇到的春季文档中所述......但无法使其正常工作。我也试过在内存中使用,但也无法使用。
这可能吗?或者我应该继续关注内存中的作业回购工作吗?
此时我并不太关心可重启性。批处理作业将作为独立的spring-boot应用程序在我的桌面上运行。
非常感谢任何帮助,提示,信息。
更新
尝试内存配置,这是我的批量配置类的一部分:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
EntityManagerFactory emf;
@Bean
public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(jobRepository);
return simpleJobLauncher;
}
@Bean
public JobRepository jobRepository(ResourcelessTransactionManager transactionManager) throws Exception {
MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);
return mapJobRepositoryFactoryBean.getObject();
}
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
项目编译正常,但是当我运行时,我得到以下内容:
引起:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[SELECT JOB_INSTANCE_ID,来自BATCH_JOB_INSTANCE的JOB_NAME = JOB_NAME =?按JOB_INSTANCE_ID desc]排序;嵌套异常是java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在
所以它似乎还在尝试与Oracle连接,而不是使用内存数据库..
答案 0 :(得分:1)
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
EntityManagerFactory emf;
@Bean
public SimpleJobLauncher jobLauncher(JobRepository jobRepository) throws Exception {
SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(jobRepository);
simpleJobLauncher.afterPropertiesSet();
return simpleJobLauncher;
}
@Bean
public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager)
throws Exception {
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager);
factory.afterPropertiesSet();
return factory;
}
@Bean
public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception {
return factory.getObject();
}
@Bean
public ResourcelessTransactionManager resourcelessTransactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobExplorer jobExplorer(MapJobRepositoryFactoryBean factory) {
return new SimpleJobExplorer(factory.getJobInstanceDao(), factory.getJobExecutionDao(),
factory.getStepExecutionDao(), factory.getExecutionContextDao());
}