在Spring Batch中使用多个DataSource

Ahm*_*ila 33 java spring datasource spring-batch

我试图在Spring Batch中配置几个数据源.在启动时,Spring Batch抛出以下异常:

To use the default BatchConfigurer the context must contain no more thanone DataSource, found 2

批量配置的代码段

@Configuration
@EnableBatchProcessing 
public class BatchJobConfiguration {

    @Primary
    @Bean(name = "baseDatasource")
    public DataSource dataSource() {
         // first datasource definition here
    }
    @Bean(name = "secondaryDataSource")
    public DataSource dataSource2() {
         // second datasource definition here
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么我看到这个异常,因为我已经看到一些基于xml的Spring批处理配置声明了多个数据源.我使用Spring Batch核心版本3.0.1.RELEASE与Spring Boot版本1.1.5.RELEASE.任何帮助将不胜感激.

小智 22

您必须提供自己的BatchConfigurer.Spring不想为你做出决定

@Configuration
@EnableBatchProcessing
public class BatchConfig {

     @Bean
      BatchConfigurer configurer(@Qualifier("batchDataSource") DataSource dataSource){
        return new DefaultBatchConfigurer(dataSource);
      }

...
Run Code Online (Sandbox Code Playgroud)


van*_*chi 20

AbstractBatchConfiguration尝试BatchConfigurer首先在容器中查找,如果没有找到,则尝试自己创建它 - 这是在容器IllegalStateException中有多个DataSourcebean的地方抛出的地方.

解决问题的方法是防止创建DefaultBatchConfigurerbean AbstractBatchConfiguration.为此,我们提示DefaultBatchConfigurer使用@Component注释创建Spring容器:

@EnableBatchProcessing放置的配置类我们可以使用@ComponentScan该文件进行注释,包含派生自DefaultBatchConfigurer以下的空类的包:

package batch_config;
...
@EnableBatchProcessing
@ComponentScan(basePackageClasses = MyBatchConfigurer.class)
public class MyBatchConfig {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个空派生类的完整代码在这里:

package batch_config.components;
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.stereotype.Component;
@Component
public class MyBatchConfigurer extends DefaultBatchConfigurer {
}
Run Code Online (Sandbox Code Playgroud)

在此配置中,@Primary注释适用于DataSourcebean,如下例所示:

@Configuration
public class BatchTestDatabaseConfig {
    @Bean
    @Primary
    public DataSource dataSource()
    {
        return .........;
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于Spring Batch版本3.0.3.RELEASE

最简单的解决方案,使@Primary上标注DataSource的工作可能只是增加@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)连同@EnableBatchProcessing注释:

@Configuration
@EnableBatchProcessing
@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
public class MyBatchConfig {
Run Code Online (Sandbox Code Playgroud)

  • 在给定的数据源上使用 Primary 是一个坏主意。每当 Spring 注入一个数据源时,它都会选择第一个数据源。我刚刚遇到了 SpringBatch 和 Spring JPA./Hibernate 的问题。Hibernate 使用 DataSource2,SpringJpa 在主数据源 (Datasource1) 上执行最终提交。 (2认同)