如果我有两个作业,每个作业都写入不同的数据源,那么在它使用的数据源中写入Spring批处理元数据(jobExecution、结果、...)是有意义的。然而,Spring批处理似乎指示您有一个“主要”数据源用于该元数据。
我定义了两个数据源,都没有标记为主数据源,应用程序无法启动:
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
我尝试创建两个配置,每个配置都扩展DefaultBatchConfigrer:
@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);
}
}
另一个完全相同,只是工作和数据源不同。
那么,为什么spring仍然试图创建AbstractBatchConfiguration,而我显然想通过扩展DefaultBatchConfigurer来实现这一点呢?
更多堆栈跟踪:
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]
Spring Batch的SimpleBatchConfiguration
是通过@EnableBatchProcess
引入的。它使用BatchConfigrer
来提供它需要添加到Application ationContext
中的组件。您真正想要做的是创建一个BatchConfigrer
,它在正确的时间提供正确的DataSource
。然后SimpleBatchConfiguration
将使用您的配置程序创建的组件将它们添加到Application ationContext
中。
你是说在你的项目中使用多个数据源吗?
这里有一个例子供你参考
https://github.com/michaelliao/springcloud/tree/master/data-multidatasource
我们正试图建立关于如何在大型IT服务中使用Spring Batch的标准,并具有不同的商业利益。 我们可能会有几个属于不同业务领域的批次。我们已经知道其中一些必须从所有批次通用的表中获取一些参数(即Java和COBOL;例如日期参数)。 我们将实现的Spring批处理作业的数量很难评估。没有重写现有COBOL批次的目标,只要有可能,就鼓励连续流程处理。 一些关于概念证明的问题不时出现,但目前几乎没
我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。
我正在编写Spring批的Spring Boot应用程序,其中ItemReader从Oracle数据库读取数据并将数据写入postgres sql,但我得到了以下错误 我不想创建spring批处理元数据表,我的应用程序不需要监视作业,请就此向我提出建议。提前谢谢!!
我需要访问两个数据源: Spring批处理存储库:在内存H2中 我的步骤需要访问。 我在那里看到了几个关于如何创建自定义
第1步--第一步从数据库中读取某些事务,并生成一个记录ID列表,这些记录ID将通过jobContext属性发送到第2步。 步骤2-这应该是一个分区步骤:从步骤应该基于从步骤1获得的列表进行分区(每个线程从列表中获得不同的Id),并在不相互干扰的情况下执行它们的读/处理/写操作。 我的问题是,尽管我希望根据步骤1产生的列表对数据进行分区,但spring在步骤1开始之前就配置了步骤2(因此调用了分区器
在表中,默认情况下传递和作业参数。当我使用REST endpoint launcher方法触发作业时,我没有看到这些参数在默认情况下被传递。 并且在每个作业运行中传递这两个参数的相同值。和。正如所料,它给出了以下异常。 我的问题是: 当我使用命令行触发作业时,为什么默认情况下传递此和作业参数? ,为什么每次运行作业时传递的两个参数的值都是一样的?即使我正在使用 方法是如何创建差异的?