我正在尝试在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 batch配置,这些配置声明了多个数据源。我正在使用Spring Batch核心版本3.0.1.RELEASE和Spring Boot版本1.1.5.RELEASE。
发布于 2015-03-20 19:15:03
AbstractBatchConfiguration
首先尝试在容器中查找BatchConfigurer
,如果没有找到,则尝试自己创建它-这是在容器中有多个DataSource
bean的情况下抛出IllegalStateException
的地方。
解决这个问题的方法是防止在AbstractBatchConfiguration
中创建DefaultBatchConfigurer
bean。为此,我们建议使用@Component
注释通过Spring容器创建DefaultBatchConfigurer
:
我们可以用@ComponentScan
注释放置@EnableBatchProcessing
的配置类,它扫描包含从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
注释适用于DataSource
bean,如以下示例所示:
@Configuration
public class BatchTestDatabaseConfig {
@Bean
@Primary
public DataSource dataSource()
{
return .........;
}
}
这适用于Spring Batch版本3.0.3.RELEASE
让DataSource
上的@Primary
批注工作的最简单的解决方案可能是只添加@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
和@EnableBatchProcessing
批注:
@Configuration
@EnableBatchProcessing
@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class)
public class MyBatchConfig {
发布于 2015-05-20 17:44:02
您必须提供自己的BatchConfigurer。Spring不想为你做这样的决定
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
BatchConfigurer configurer(@Qualifier("batchDataSource") DataSource dataSource){
return new DefaultBatchConfigurer(dataSource);
}
...
发布于 2018-07-31 05:51:22
最简单的解决方案是扩展DefaultBatchConfigurer并通过限定符自动连接您的数据源:
@Component
public class MyBatchConfigurer extends DefaultBatchConfigurer {
/**
* Initialize the BatchConfigurer to use the datasource of your choosing
* @param firstDataSource
*/
@Autowired
public MyBatchConfigurer(@Qualifier("firstDataSource") DataSource firstDataSource) {
super(firstDataSource);
}
}
附注(因为这也涉及到多个数据源的使用):如果您使用autoconfig来运行数据初始化脚本,您可能会注意到它不是在您期望的数据源上进行初始化。对于这个问题,看一下这个:https://github.com/spring-projects/spring-boot/issues/9528
https://stackoverflow.com/questions/25540502
复制相似问题