当前位置: 首页 > 知识库问答 >
问题:

当有3个数据源没有@Primary时,Spring批处理设置数据源

哈泰
2023-03-14

我的系统有三个数据源,都以名为datasourceA、datasourceB、datasourceC的bean的形式公开。我试图将spring batch的数据源设置为datasourceB,但我遇到了一些问题。

我的Spring班

@Configuration
@EnableBatchProcessing
public class JobBatchConfiguration extends DefaultBatchConfigurer {
    @Override
    public void setDataSource(@Qualifier("dataSourceB") DataSource dataSource) {
        super.setDataSource(dataSource);
    }

    @Bean
    public BatchDataSourceInitializer batchDatabaseInitializer(@Qualifier("dataSourceB") DataSource dataSource, ResourceLoader resourceLoader){
        BatchProperties batchProperties = new BatchProperties();
        batchProperties.setInitializeSchema(DataSourceInitializationMode.ALWAYS);
        BatchDataSourceInitializer batchDatabaseInitializer = new  BatchDataSourceInitializer(dataSource, resourceLoader, batchProperties);
        return batchDatabaseInitializer;
    }
}

在这个设置中,我在启动时会遇到这个错误

Field dataSource in org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration required a single bean, but 3 were found:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

我无法将我的任何数据源设置为@Prime,因为我的Spring批处理编写器使用所有3个数据源进行读取和写入。我正在使用JPA存储库和Spring数据。

有解决办法吗?我认为覆盖setDataSource就足够了

共有1个答案

卫弘懿
2023-03-14

您应该在bean定义上放置@Qualifier,并在bean自动连接时放置到位。

// data sources config
@Bean
@Qualifier("dataSourceB")
public DataSource dataSourceB() { ... }

// batch processing config
public void setDataSource(@Qualifier("dataSourceB") DataSource dataSource) { ... }

此外,不需要使用@Qualifier,因为Spring使用bean名称作为后备限定符。引用https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-自动连线注释限定符:

对于回退匹配,bean名称被视为默认限定符值。

因此,您可以重命名变量以匹配要自动装配的bean名称。

// data sources config
@Bean
public DataSource dataSourceB() { ... }

// batch processing config
public void setDataSource(DataSource dataSourceB) { ... }
 类似资料:
  • 我必须在表中的一些配置数据库中爬行。其中每个记录指定要从中读取的模式。因此,我们必须对表格进行投票,并适当地运行作业。 考虑使用Spring批处理(JdbcPagingItemReader)从所有配置的模式中读取数据。如果我必须配置它,如何使用Spring批处理? 我应该使用不同的读取器为每个数据库读取多个作业,还是有什么方法可以在运行时发送数据源以供Spring Batch读取数据? 如何为单个

  • 我需要访问两个数据源: Spring批处理存储库:在内存H2中 我的步骤需要访问。 我在那里看到了几个关于如何创建自定义

  • 我正在编写Spring批的Spring Boot应用程序,其中ItemReader从Oracle数据库读取数据并将数据写入postgres sql,但我得到了以下错误 我不想创建spring批处理元数据表,我的应用程序不需要监视作业,请就此向我提出建议。提前谢谢!!

  • 我试图在spring boot项目中配置spring批处理,我想在没有数据源的情况下使用它。我发现是一条可行之路,但我无法让它发挥作用。问题是我已经定义了另外3个数据源,但我不想在springBatch中使用其中任何一个。 我已经检查了默认实现,如果找不到数据源,它将完全按照我的要求执行。问题是我有三个,不想用任何一个。 请不要建议使用hsql或其他内存DB,因为我不想这样。

  • 我有一个Spring Boot(面向批处理)应用程序,它使用一个数据源来完成批处理作业,并将内容写入数据库。 我在类似: 问题是,当我尝试将数据源注入一个Spring配置文件时: ...它告诉我: 无法自动连线。存在多个“DataSource”类型的bean。 Beans:数据源 我还尝试注入数据源,例如: ...但是没有运气:(,尽管这两个数据源的问题最终消失了。 有什么线索可以“绕过”吗?

  • 在我的例子中,我使用Spring boot和MySQL DB。我有两个数据库用户。 管理员用户由liquibase用来创建表。它有自己的数据源 现在我正在尝试将Spring批处理添加到服务中。我得到了一个重复的bean异常。当我将@Primary添加到liquibase datasource时,它得到了修复,但我们不想将其用于批处理的读/写操作。 如果我在Dev User数据源中添加@Prime,