我正在尝试用@EnableBatchProcessing(modular = true)配置两个作业。据我所知,这是为了防止命名冲突。
以下是我的职务配置:
@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。
我还定义了以下配置:
@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)
如何正确配置这些作业?
发布于 2020-04-24 22:07:18
@EnableBatchProcessing是一个Spring注释,它早于Spring。因此,您需要考虑它在Spring上下文中是如何工作的。我看了一下你的示例应用程序。让我先解释一下出了什么问题,然后再解释如何解决它。
问题
按照javadoc配置@EnableBatchProcessing(modular=true)时,在当前上下文中没有不希望被引导的@Bean定义。相反,您可以将ApplicationContextFactory实现提供为@Bean,每个实现都定义作业的子上下文。
然而,在您的应用程序中有一个陷阱。如前所述,@EnableBatchProcessing早于Spring,因此您需要考虑它在Spring上下文中是如何工作的。在您的示例中,示例应用程序具有相同包中的所有类。默认情况下,Spring将对包中的@Configuration带注释类执行类路径扫描,在包中定义带有@SpringBootApplication和“下面”注释的类。因此,在示例应用程序中,Spring自动将Dummy1和Dummy2引入到导致错误的父上下文中。
解决方案
要解决此问题,需要防止Spring在类路径扫描中包括您的子上下文配置。为了证明这一点,我通过将Dummy1和Dummy2移动到包com.example (在带有@SpringBootApplication注释的类之上的一个级别)来测试示例应用程序。这使得Spring无法通过类路径扫描来获取它们,并允许该应用程序启动correctly...with,另外两个小的调整:
Dummy1和Dummy2中,您将两个作业名配置为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没有捕获Dummy1和Dummy2,应用程序就会像您预期的那样工作。祝好运!
https://stackoverflow.com/questions/61370476
复制相似问题