我正在使用Spring Boot Spring Batch(注释),遇到了我必须运行2个作业的场景 .
我有需要使用spring批处理更新的员工和薪资记录 . 我已经按照本教程spring-batch getting started tutorial为Employee和Salary对象配置了 BatchConiguration
类,分别命名为BatchConfigurationEmployee和BatchConfigurationSalary .
我已经按照上面提到的教程定义了 ItemReader
, ItemProcessor
, ItemWriter
和 Job
.
当我启动我的Spring Boot应用程序时,我想要运行两个BatchConfigured类 . 我怎样才能做到这一点
********* BatchConfigurationEmployee.java *************
@Configuration
@EnableBatchProcessing
public class BatchConfigurationEmployee {
public ItemReader<employee> reader() {
return new EmployeeItemReader();
}
@Bean
public ItemProcessor<Employee, Employee> processor() {
return new EmployeeItemProcessor();
}
@Bean
public Job Employee(JobBuilderFactory jobs, Step s1) {
return jobs.get("Employee")
.incrementer(new RunIdIncrementer())
.flow(s1)
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Employee> reader,
ItemProcessor<Employee, Employee> processor) {
return stepBuilderFactory.get("step1")
.<Employee, Employee> chunk(1)
.reader(reader)
.processor(processor)
.build();
}
}
薪资等级在这里
@Configuration
@EnableBatchProcessing
public class BatchConfigurationSalary {
public ItemReader<Salary> reader() {
return new SalaryItemReader();
}
@Bean
public ItemProcessor<Salary, Salary> processor() {
return new SalaryItemProcessor();
}
@Bean
public Job salary(JobBuilderFactory jobs, Step s1) {
return jobs.get("Salary")
.incrementer(new RunIdIncrementer())
.flow(s1)
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<Salary> reader,
ItemProcessor<Salary, Salary> processor) {
return stepBuilderFactory.get("step1")
.<Salary, Salary> chunk(1)
.reader(reader)
.processor(processor)
.build();
}
}
2 回答
Bean的名称在整个Spring Context中必须是唯一的 .
在这两个作业中,您使用相同的方法名实例化读取器,写入器和处理器 . methodname是用于在上下文中标识bean的名称 .
在两个作业定义中,您都有reader(),writer()和processor() . 他们会互相覆盖 . 给他们一些唯一的名称,如readerEmployee(),readerSalary()等 .
那应该可以解决你的问题 .
你的作业没有用@Bean注释,所以spring-context不知道它们 .
看看JobLauncherCommandLineRunner类 . 将注入实现Job接口的SpringContext中的所有Bean . 找到的所有作业都将被执行 . (这发生在JobLauncherCommandLineRunner中的方法executeLocalJobs中)
如果出于某种原因,你不想在上下文中将它们作为bean,那么你必须使用jobregistry注册你的作业 . (JobLauncherCommandLineRunner的执行registeredJobs的方法将负责启动已注册的作业)
顺便说一句,你可以控制 property
哪些工作应该启动 .