【发布时间】:2018-11-30 11:46:30
【问题描述】:
如果我有 2 个作业,每个作业都写入不同的数据源,那么在它使用的数据源中写入 spring 批处理元数据(jobExecution、结果……)是有意义的。然而,spring batch 似乎指示您拥有一个用于该元数据的“主要”数据源。
我定义了两个数据源,都没有标记为主,应用启动失败:
Field dataSource in org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration required a single bean, but 2 were found:
- firstDataSource: defined by method 'firstDataSource' in class path resource [secret/DataSourceConfig.class]
- secondDataSource: defined by method 'secondDataSource' in class path resource [secret/DataSourceConfig.class]
Action:
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
我尝试创建两个配置,每个配置都扩展 DefaultBatchConfigurer:
@Configuration
@EnableBatchProcessing
public class MyJobConfiguration extends DefaultBatchConfigurer {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Bean
public Job my_job(@Qualifier("somestep") Step step) {
return jobBuilderFactory.get("my_job")
.start(step)
.build();
}
@Bean
@Profile("my_job")
public JobExecution launchMyJob(@Qualifier("my_job") Job job, JobLauncher jobLauncher) throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
Map<String, JobParameter> params = new HashMap<>();
params.put("Time", new JobParameter(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date())));
return jobLauncher.run(job, new JobParameters(params));
}
@Override
@Autowired
public void setDataSource(@Qualifier("firstDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
}
另一个完全相同,只是作业和数据源不同。
那么当我显然想通过扩展 DefaultBatchConfigurer 自己创建一个 AbstractBatchConfiguration 时,为什么 spring 仍然尝试创建呢?
更多堆栈跟踪:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration': Unsatisfied dependency expressed through field 'dataSource'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: firstDataSource,secondDataSource
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
【问题讨论】:
标签: java spring spring-boot spring-batch