Spring Batch不使用自定义数据源来创建表

时间:2017-04-27 10:29:50

标签: java spring spring-boot spring-batch

我正在开发REST服务(使用Spring启动),它运行批处理作业。我希望Batch只能用于 嵌入式数据源(用于存储元数据),而默认数据源(在我的情况下为Postgres)将用于存储商务实体。

问题是Batch尝试在启动时在默认数据源中创建元数据表(如 batch_job_execution batch_job_instance 等)。

以下是重现问题的示例配置:

BatchConfiguration

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

DataSourceConfiguration

@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();
    }
}

使用这种配置,当微服务启动时,我在Postgres中获得批处理表,但是看来,使用了嵌入数据源,因为我在尝试使用“Table not found”错误找工作。

那么我应该如何正确编写配置以使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;
    }
}

1 个答案:

答案 0 :(得分:1)

使用Spring Boot,DataSource使用的BatchDatabaseInitializer遗憾地与BatchConfigurer无关。它只是在上下文中抓取默认的DataSource。如果您配置自己的BatchDatabaseInitializer,则Boot one将不会启动,您可以定义直接使用的DataSource