Spring Boot& Spring Batch自动接线

时间:2015-07-20 19:36:07

标签: spring spring-boot spring-batch

我试图让我了解Spring Boot的Spring Batch自动接线。在Spring文档的示例中,有许多参数在构造函数中传递给某些bean。

该示例有效,但如果我尝试使用相同的配置创建另一个作业(命名为importUserJob2),我会得到一个非唯一的bean异常 - 错误报告有两个步骤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个?我是否需要在创建步骤时对这些步骤进行限定以确保注入正确的步骤?

1 个答案:

答案 0 :(得分:4)

在两种作业定义方法中,您使用“步骤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。