首页 文章

如何使用注释在spring批处理中运行多个作业

提问于
浏览
3

我正在使用Spring Boot Spring Batch(注释),遇到了我必须运行2个作业的场景 .

我有需要使用spring批处理更新的员工和薪资记录 . 我已经按照本教程spring-batch getting started tutorial为Employee和Salary对象配置了 BatchConiguration 类,分别命名为BatchConfigurationEmployee和BatchConfigurationSalary .

我已经按照上面提到的教程定义了 ItemReaderItemProcessorItemWriterJob .

当我启动我的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 回答

  • 8

    Bean的名称在整个Spring Context中必须是唯一的 .

    在这两个作业中,您使用相同的方法名实例化读取器,写入器和处理器 . methodname是用于在上下文中标识bean的名称 .

    在两个作业定义中,您都有reader(),writer()和processor() . 他们会互相覆盖 . 给他们一些唯一的名称,如readerEmployee(),readerSalary()等 .

    那应该可以解决你的问题 .

  • 1

    你的作业没有用@Bean注释,所以spring-context不知道它们 .

    看看JobLauncherCommandLineRunner类 . 将注入实现Job接口的SpringContext中的所有Bean . 找到的所有作业都将被执行 . (这发生在JobLauncherCommandLineRunner中的方法executeLocalJobs中)

    如果出于某种原因,你不想在上下文中将它们作为bean,那么你必须使用jobregistry注册你的作业 . (JobLauncherCommandLineRunner的执行registeredJobs的方法将负责启动已注册的作业)

    顺便说一句,你可以控制 property

    spring.batch.job.names= # Comma-separated list of job names to execute on startup (For instance
     `job1,job2`). By default, all Jobs found in the context are executed.
    

    哪些工作应该启动 .

相关问题