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。
我正在尝试着手研究 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。