首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有modular=true的Spring批处理不适用于多个作业

带有modular=true的Spring批处理不适用于多个作业
EN

Stack Overflow用户
提问于 2020-04-22 16:44:17
回答 1查看 1.4K关注 0票数 3

我正在尝试用@EnableBatchProcessing(modular = true)配置两个作业。据我所知,这是为了防止命名冲突。

以下是我的职务配置:

代码语言:javascript
复制
@Configuration
public class Dummy1 {

    @Autowired
    JobBuilderFactory jobBuilderFactory;
    @Autowired
    StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step step() {
        // < build step. Omitted for code clarity > 
    }

    @Bean
    public Job getJob() {
        return jobBuilderFactory.get("dummy-job-1")
                .start(step())
                .build();
    }
}

我有一个类似的类,名为Dummy2

我还定义了以下配置:

代码语言:javascript
复制
@Configuration
@EnableAutoConfiguration
@EnableBatchProcessing(modular = true)
public class BatchConfig {

    @Bean
    public ApplicationContextFactory getDummy1() {
        return new GenericApplicationContextFactory(Dummy1.class);
    }

    @Bean
    public ApplicationContextFactory getDummy2() {
        return new GenericApplicationContextFactory(Dummy2.class);
    }
}

在运行我要得到的应用程序时:

类路径资源~ path ~/Dumm2.class中定义的bean 'step‘无法注册。已经在类路径资源~ path ~/Dumm1.class中定义了具有该名称的bean,并且禁用了覆盖。

但我认为这是modular=true的全部要点。也就是处理名字冲突。

另一方面,如果我启用bean覆盖,则剩下第二个任务覆盖第一个任务。

也就是说,@Autowired List<Job>只有一个作业(来自Dummy2.class)

如何正确配置这些作业?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 22:07:18

@EnableBatchProcessing是一个Spring注释,它早于Spring。因此,您需要考虑它在Spring上下文中是如何工作的。我看了一下你的示例应用程序。让我先解释一下出了什么问题,然后再解释如何解决它。

问题

按照javadoc配置@EnableBatchProcessing(modular=true)时,在当前上下文中没有不希望被引导的@Bean定义。相反,您可以将ApplicationContextFactory实现提供为@Bean,每个实现都定义作业的子上下文。

然而,在您的应用程序中有一个陷阱。如前所述,@EnableBatchProcessing早于Spring,因此您需要考虑它在Spring上下文中是如何工作的。在您的示例中,示例应用程序具有相同包中的所有类。默认情况下,Spring将对包中的@Configuration带注释类执行类路径扫描,在包中定义带有@SpringBootApplication和“下面”注释的类。因此,在示例应用程序中,Spring自动将Dummy1Dummy2引入到导致错误的父上下文中。

解决方案

要解决此问题,需要防止Spring在类路径扫描中包括您的子上下文配置。为了证明这一点,我通过将Dummy1Dummy2移动到包com.example (在带有@SpringBootApplication注释的类之上的一个级别)来测试示例应用程序。这使得Spring无法通过类路径扫描来获取它们,并允许该应用程序启动correctly...with,另外两个小的调整:

  1. 虽然可以在模块化配置中复制bean名称,但实际的作业名称却不能。在Dummy1Dummy2中,您将两个作业名配置为dummy-job-1。将其中一个更改为dummy-job-2,解决此dummy-job-2启动需要批处理应用程序的数据源。我将HSQLDB添加到POM中,以证明我的修补程序有效。

通过这些更改,您将能够构建应用程序并通过命令运行它:java -jar target/demo-0.0.1-SNAPSHOT.jar --spring.batch.job.names=dummy-job-1运行作业1,java -jar target/demo-0.0.1-SNAPSHOT.jar --spring.batch.job.names=dummy-job-2运行作业2。

还有很多其他方法可以移动类,以防止Spring的类路径扫描来获取它们,只要Spring没有捕获Dummy1Dummy2,应用程序就会像您预期的那样工作。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61370476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档