Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧批不';t使用自定义数据源创建表_Java_Spring_Spring Boot_Spring Batch - Fatal编程技术网

Java 弹簧批不';t使用自定义数据源创建表

Java 弹簧批不';t使用自定义数据源创建表,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我正在使用REST服务(使用SpringBoot),它运行批处理作业。我希望批处理只与 嵌入式数据源(用于存储元数据),而默认数据源(在我的例子中是Postgres)将用于存储业务实体 问题是Batch在启动时试图在默认数据源中创建元数据表(如Batch_job_execution、Batch_job_instance等) 下面是示例配置,它再现了问题: 批量配置 @Configuration @EnableBatchProcessing public class BatchConfigurat

我正在使用REST服务(使用SpringBoot),它运行批处理作业。我希望批处理只与 嵌入式数据源(用于存储元数据),而默认数据源(在我的例子中是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);
    }
}
@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();
    }
}
数据源配置

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}
@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();
    }
}
通过这种配置,当microservice启动时,我在Postgres中获得批处理表,尽管在软件之后,似乎使用了嵌入的数据源,因为我在尝试启动作业时得到H2的“Table not found”错误

那么,我应该如何正确地编写配置,使批处理只与嵌入式数据源一起工作呢?我不希望主数据源中有任何元数据(甚至是空表)

更新:

正如Michael Minella所说,应该再添加一个bean:

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

不幸的是,使用Spring Boot时,
BatchDataSourceInitializer
使用的
数据源与
BatchConfigurer
不相关。它只是在上下文中获取默认的
数据源。如果您配置自己的
BatchDataSourceInitializer
,则启动程序不会启动,您可以定义直接使用哪个
DataSource

您必须配置两个不同的数据源。Spring boot将在从以“Spring.datasource”为前缀的properties/yml中读取数据资源信息后为您自动配置一个。此数据源将用于存储Spring批处理元表。您必须自己创建的第二个数据源可以用作默认数据源为什么您认为“spring.datasource”属性只会影响批处理相关的数据源?您能举一个您如何看待它的例子吗?顺便说一句,您能解释一下为什么让配置扩展
DefaultBatchConfigurer
class很重要吗?我曾尝试将configurer作为一个常规bean,但在这种情况下没有使用它。它不需要扩展
DefaultBatchConfigurer
,但如果不这样做,则需要完成
BatchConfigurer
接口的实现,该接口的工作量可能比需要的要大。@MichaelMinella如果我没有任何主数据源该怎么办。在我的例子中,我得到了3个数据源,处理器和写入程序访问了所有3个数据源。你有时间的时候能查一下吗