Mik*_*nko 6 java spring spring-batch spring-boot
我正在研究 REST 服务(使用 Spring boot),它运行批处理作业。我希望 Batch 仅适用于嵌入式数据源(用于存储元数据),而默认数据源(在我的例子中为 Postgres)将用于存储业务实体。
问题是 Batch在启动时尝试在默认数据源中创建元数据表(如batch_job_execution、batch_job_instance等)。
这是重现问题的示例配置:
批量配置
@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {
@Override
@Autowired
public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
}
Run Code Online (Sandbox Code Playgroud)
数据源配置
@Configuration
public class DataSourceConfiguration {
@Bean
@Primary
public DataSource DataSource() {
final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(org.postgresql.Driver.class);
dataSource.setUrl("jdbc:postgresql://localhost:5432/test_batch");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean(name = "batchDataSource")
public DataSource batchDataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
}
Run Code Online (Sandbox Code Playgroud)
通过此配置,当微服务启动时,我在 Postgres 中获取批处理表,尽管之后似乎使用了嵌入数据源,因为在尝试启动作业时,我收到 H2 的“找不到表”错误。
那么我应该如何正确编写配置以使 Batch 仅适用于嵌入式数据源?我不想在主数据源中出现任何元数据(甚至是空表)。
更新:
正如 Michael Minella 所说,应该再添加一颗豆子:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {
@Override
@Autowired
public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
@Bean
public BatchDatabaseInitializer batchDatabaseInitializer(@Qualifier("batchDataSource") DataSource dataSource, ResourceLoader resourceLoader){
BatchDatabaseInitializer batchDatabaseInitializer = new BatchDatabaseInitializer(dataSource, resourceLoader, new BatchProperties());
return batchDatabaseInitializer;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,DataSource
使用Spring Boot与. 它只是获取上下文中的默认值。如果您配置自己的,则 Boot 不会启动,您可以定义直接使用哪个。BatchDataSourceInitializer
BatchConfigurer
DataSource
BatchDataSourceInitializer
DataSource