我想为spring批处理使用不同的数据源,并创建了下面的配置类,并根据文档将我所需的数据源自动连接到该类。
我使用的是spring boot(2.2.6)和spring batch版本4.2.1。释放
@Configuration
public class CustomBatchConfigurer extends DefaultBatchConfigurer {
@Autowired
@Qualifier("oracleDataSource")
private DataSource dataSource;
@Autowired
private PlatformTransactionManager transactionManager;
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
factory.setTablePrefix("MYDB.BATCH_");
factory.setMaxVarCharLength(1000);
factory.afterPropertiesSet();
return factory.getObject();
}
}
但当我用它启动应用程序时,它从不应用setTablePrefix,并且总是会失败,出现table not found错误。
我需要使用上面的方法,因为我有两个不同的数据源,我需要spring批处理来使用我的oracleDataSource bean。
如果我禁用非oracleDataSource bean,并将属性移动到应用程序。物业,一切正常。
请指导如何解决这个问题。我在这里看到了一个类似的问题,用户在以不同的模式扩展DefaultBatchConfigurer类Spring批处理表后,抱怨同一个表找不到问题
调试spring批处理源代码后,我发现在创建jobExplorer时,表前缀被重置。有效的修复方法如下所示。
我认为这应该在Spring批处理留档中提到,因为jobExplorer是常用的,如果没有正确覆盖,可以将表前缀重置回BATCH_,如下所示。
@Configuration
public class CustomBatchConfigurer extends DefaultBatchConfigurer {
@Autowired
@Qualifier("oracleDataSource")
private DataSource dataSource;
@Autowired
private PlatformTransactionManager transactionManager;
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
factory.setTablePrefix("MYDB.BATCH_");
factory.setMaxVarCharLength(1000);
factory.afterPropertiesSet();
return factory.getObject();
}
@Override
protected JobLauncher createJobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(createJobRepository());
jobLauncher.afterPropertiesSet();
return jobLauncher;
}
@Override
protected JobExplorer createJobExplorer() throws Exception {
JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean();
jobExplorerFactoryBean.setDataSource(this.dataSource);
jobExplorerFactoryBean.setTablePrefix("MYDB.BATCH_");
jobExplorerFactoryBean.afterPropertiesSet();
return jobExplorerFactoryBean.getObject();
}
}
当我在应用程序属性中添加表前缀时,我遇到了一个问题,Spring Batch没有获取该属性并设置默认前缀Batch。 Spring版 org.springframework.jdbc.错误的SQL语法[SELECTJOB_INSTANCE_ID,JOB_NAMEBATCH_JOB_INSTANCEJOB_NAME=?和JOB_KEY = ?]; 嵌套异常java.sql.SQLSyntaError
在Spring batch中(请参见https://docs.Spring.io/spring-batch/3.0.x/reference/html/metadataschema.html),有六个表: batch_job_execution batch_job_execution_context batch_job_execution_params batch_job_instance batc
如果我的平面文件中有不正确数量的令牌,我会遇到以下异常。 如果我抓住了错误的标记异常我想打印自定义错误日志与文件名,行号和行引起异常。 帮助我。 非常感谢。
我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?
我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。
反正可以禁用SQL,我只是想测试我的读写器和处理器工作正常。