【问题标题】:Haw spring batch application are startedHaw spring 批处理应用程序启动
【发布时间】:2018-04-22 12:51:38
【问题描述】:

对不起,这对某些人来说可能是个菜鸟问题,但我突然想到了,我认为值得修正我的想法并从一些专家那里得到相关的解释。

我刚开始 Spring Batch 教程,我对如何启动这些应用程序感到困惑。让我们在官方网站上举这个例子

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

这里是配置类

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public DataSource dataSource;


    // tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<Person, Person> chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }
    // end::jobstep[]
}

这里提到main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。

我不清楚importUserJob 的工作是如何执行的,而 没有找到显示我们如何开始这项工作的明确代码,它只是一个配置部分(声明)。

另一方面,我发现了另一个启动 Spring 应用程序的示例,如下所示:

public static void main(String[] args) {
    GenericApplicationContext context = new AnnotationConfigApplicationContext(MyBatchConfiguration.class);
    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("myJobName");//this is bean name of your job 
    JobExecution execution = jobLauncher.run(job, jobParameters);
}

这里我可以理解,作业是用jobLauncher执行的。

【问题讨论】:

标签: spring-boot spring-batch


【解决方案1】:

这是 Spring 中的控制反转(IOC,或依赖注入)。本质上是这样的:

  1. Application 上的 @SpringBootApplication 告诉 Spring 它应该在 Application 的包和所有子包中搜索带有相关注释的类
  2. BatchConfiguration 上的@Configuration 注释是一个非常相关的注释,它告诉 Spring 这个类包含有关如何配置应用程序的信息。这意味着 Spring 将创建此类的一个实例并读取其上的所有属性和方法以搜索更多信息。
  3. BatchConfiguration 中各个字段上的 @Autowired 注释告诉 Spring,在实例化此类时,这些字段应设置为适用的 bean(注入)。
  4. importUserJob 上的 @Bean 注释告诉 Spring 此方法生成一个 bean,这意味着 Spring 将调用此方法并将生成的 bean 存储在 Job 类型下(以及它继承的任何接口/超类)和在importUserJob 名称下。
  5. 已构建作业的更多注释将触发 Spring 的其他操作。它可能包含告诉 Spring 运行各种功能、将其连接到某些事件的注释。或者另一个 bean 请求所有 Job 实例,并在它告诉 Spring 执行的方法中使用它。

@EnableBatchProcessing 注解是一个元注解,它告诉 Spring 搜索其他包并导入其他配置类以使请求注入的 bean(使用@Autowired 进行注解)可用。

IOC 可以是一个非常先进的概念,一开始就可以掌握,Spring 绝对不是那里最简单的 IOC 框架——尽管它是我个人的最爱——但如果你想了解更多关于 Spring 框架和 IOC 的信息,我建议你首先阅读documentation,然后继续搜索教程。

【讨论】:

  • 谢谢@Raniz,感谢这个描述和Luca的评论,我已经能够澄清整个过程
猜你喜欢
  • 2012-01-06
  • 2018-09-27
  • 2014-05-14
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2016-05-24
  • 1970-01-01
相关资源
最近更新 更多