Spring 开机 & Spring 批量自动布线

Spring Boot & Spring Batch auto wiring

我正在尝试着手研究 Spring Boot 的 Spring 批处理自动布线。在 Spring 文档中的示例中,在构造函数中将许多参数传递给某些 bean。

该示例有效,但如果我尝试使用相同的配置创建另一个作业(将其命名为 importUserJob2),我会得到一个非唯一的 bean 异常 - 错误报告有 2 个步骤 bean。

@Bean
    public Job importUserJob(JobBuilderFactory jobs, Step s1, JobExecutionListener listener) {
        return jobs.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(s1)
                .end()
                .build();
    }

这里的构造函数和参数一起使用时是什么意思(我看不到这些参数是在哪里提供的)以及这些bean是在哪里创建的?我如何创建 2 个工作?

编辑:这是我得到的 2 个作业、2 个步骤和异常。

@Bean
public Job helloJob(JobBuilderFactory jobs, Step s1, JobExecutionListener listener) {
    return jobs.get("helloJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(s1)
            .end()
            .build();
}

@Bean
public Step step1(StepBuilderFactory stepBuilderFactory) {
    return stepBuilderFactory.get("step1")
            .tasklet(helloTasklet())
            .build();
}


@Bean
public Job otherJob(JobBuilderFactory jobs, Step s1, JobExecutionListener listener) {
    return jobs.get("otherJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(s1)
            .end()
            .build();
}

@Bean
public Step step2(StepBuilderFactory stepBuilderFactory, ItemReader<MyReadItem> reader,
                        ItemWriter< MyReadItem > writer) {
    return stepBuilderFactory.get("step2")
            .< MyReadItem, MyReadItem > chunk(10)
            .reader(reader)
            .writer(writer)
            .build();
}

例外情况:

nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.batch.core.Step] is defined: expected single matching bean but found 2: step1,step2

是什么创造了 Step s1?我是否认为 Spring 只是寻找任何类型正确的 bean (Step),但是找到了 2 个?我是否需要在创建步骤时对其进行限定以确保注入正确的步骤?

在您的两种作业定义方法中,您都使用 "Step s1" 作为参数。由于 "s1" 不是 bean 的名称,因此 spring 将尝试按类型自动装配。但是,它会在上下文中找到两个步骤("step1" 和 "step2")。我想,这就是你例外的原因。 您可以更改参数中的名称,或直接调用定义中的方法:

@Bean
public Job otherJob(JobBuilderFactory jobs, JobExecutionListener listener) {
    return jobs.get("otherJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step2())
            .end()
            .build();
}

Spring 注意,它不是简单地调用 step2 方法,而是提供一个真正的 spring-bean。