在春季批处理中使用多个数据源

2022-09-01 00:34:49

我正在尝试在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
    }
    ...
}

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


答案 1

您必须提供自己的 BatchConfigurer。春天不想为你做这个决定

@Configuration
@EnableBatchProcessing
public class BatchConfig {

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

...

答案 2

AbstractBatchConfiguration首先尝试在容器中查找BathAckConfigurer,如果找不到它,然后尝试自己创建它 - 这是在容器中有多个DataSource Bean的地方。IllegalStateException

解决此问题的方法是防止在 中创建 DefaultBatchConfigurer Bean。为此,我们提示使用@Component注释创建Spring容器:AbstractBatchConfigurationDefaultBatchConfigurer

放置@EnableBatchProcessing的配置类,我们可以使用扫描包含从 派生的空类的包的@ComponentScan进行注释:DefaultBatchConfigurer

package batch_config;
...
@EnableBatchProcessing
@ComponentScan(basePackageClasses = MyBatchConfigurer.class)
public class MyBatchConfig {
    ...
}

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

package batch_config.components;
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.stereotype.Component;
@Component
public class MyBatchConfigurer extends DefaultBatchConfigurer {
}

在此配置中,@Primary注释适用于bean,如下面的示例所示:DataSource

@Configuration
public class BatchTestDatabaseConfig {
    @Bean
    @Primary
    public DataSource dataSource()
    {
        return .........;
    }
}

这适用于Spring Batch版本3.0.3.RELEASE。

对工作进行注释的最简单解决方案可能只是添加注释:@PrimaryDataSource@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)@EnableBatchProcessing

@Configuration
@EnableBatchProcessing
@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
public class MyBatchConfig {

推荐