春季批处理中每个作业的不同Jobrepository数据源?

Posted

技术标签:

【中文标题】春季批处理中每个作业的不同Jobrepository数据源?【英文标题】:Different Jobrepository datasource per job in spring batch? 【发布时间】: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]

【问题讨论】:

【参考方案1】:

Spring Batch 的SimpleBatchConfiguration 是通过@EnableBatchProcessing 引入的。它使用BatchConfigurer 提供它需要添加到ApplicationContext 的组件。您真正想做的是创建一个BatchConfigurer,在正确的时间提供正确的DataSource。然后SimpleBatchConfiguration 将使用您的配置器创建的组件将它们添加到ApplicationContext

【讨论】:

【参考方案2】:

您的意思是在您的项目中使用多个数据源吗?

这里有一个例子供你参考

https://github.com/michaelliao/springcloud/tree/master/data-multidatasource

【讨论】:

不,我已经在使用多个数据源。问题是为 Spring Batch 元数据配置两个数据源,每个数据源用于各自的作业。

以上是关于春季批处理中每个作业的不同Jobrepository数据源?的主要内容,如果未能解决你的问题,请参考以下文章

动态创建作业的春季批处理测试

春季批处理作业未读取第一行

信号与系统 2023(春季) 作业要求 - 第三次作业

TransactionRequiredException:没有事务正在进行春季批处理作业和休眠

信号与系统2022春季学期作业统计处理

春季批处理:如果作业在最后 xx 分钟内失败,则向 grafana 和 prometheus 发出警报