📜  Spring Batch-基本应用程序(1)

📅  最后修改于: 2023-12-03 14:47:32.485000             🧑  作者: Mango

Spring Batch-基本应用程序

Spring Batch 是一个强大的批量处理框架,可以帮助开发者轻松地编写各种批量任务,并提供大量的工具和接口支持。

本文将介绍 Spring Batch 的基本应用程序,包括如何创建 job、step,如何读取、处理、写入数据等等。

1. 安装 Spring Batch

Spring Batch 可以通过 Maven 或 Gradle 进行安装,这里我们以 Maven 为例。

在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-core</artifactId>
    <version>4.1.1.RELEASE</version>
</dependency>
2. 创建 Spring Batch Job

在 Spring Batch 中,每个任务都是由一个或多个 step 组成的 job。我们可以通过 JobBuilderFactory 来创建 job 对象。

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

在上面的例子中,我们创建了一个名为 importUserJob 的 job,并将它绑定到一个 step 对象 s1 上。

通过 incrementer 方法,我们可以指定一个自增的参数,可以用于保持 job 运行的独立性。

3. 创建 Spring Batch Step

一个 job 由多个 step 组成,我们可以通过 StepBuilderFactory 来创建 step 对象。

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

在上面的例子中,我们创建了一个名为 step1 的 step,并指定了它的读取(reader)、处理(processor)和写入(writer)方式。通过 chunk 方法,我们可以一次性处理多条数据。

4. 创建数据读取器(ItemReader)

数据读取器用于从外部数据源中读取数据,Spring Batch 内置了多种数据读取器,包括 JdbcPagingItemReader(从数据库中读取数据)、FlatFileItemReader(从文件中读取数据)等,我们也可以根据需求自定义数据读取器。

@Bean
public FlatFileItemReader<Person> reader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("sample-data.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "firstName", "lastName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    return reader;
}

在上面的例子中,我们创建了一个 FlatFileItemReader 对象,并指定了它读取文件的位置及其数据映射方式。

5. 创建数据写入器(ItemWriter)

数据写入器用于将数据写入到目标数据源中,Spring Batch 内置了多种数据写入器,包括 JdbcBatchItemWriter(将数据批量写入到数据库中)、FlatFileItemWriter(将数据写入到文件中)等,我们也可以根据需求自定义数据写入器。

@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
    return new JdbcBatchItemWriterBuilder<Person>()
        .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
        .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
        .dataSource(dataSource)
        .build();
}

在上面的例子中,我们创建了一个 JdbcBatchItemWriter 对象,并指定了它写入数据的 SQL 语句及数据源。

6. 创建数据处理器(ItemProcessor)

数据处理器用于对数据进行处理,例如过滤、转换等操作。Spring Batch 中的数据处理器需要实现 ItemProcessor 接口,具体实现方式根据需求而定。

@Bean
public PersonItemProcessor processor() {
    return new PersonItemProcessor();
}

在上面的例子中,我们创建了一个 PersonItemProcessor 对象,它实现了 ItemProcessor 接口,用于将输入的 Person 对象转换成大写形式。

7. 运行 Spring Batch Job

当所有的 job 和 step 都创建好之后,我们可以通过 JobLauncher 来启动 job 执行。

@Autowired
JobLauncher jobLauncher;

@Autowired
Job importUserJob;

@Bean
public CommandLineRunner commandLineRunner() {
    return new CommandLineRunner() {
        @Override
        public void run(String... args) throws Exception {
            JobParameters jobParameters = new JobParametersBuilder()
                    .addLong("time", System.currentTimeMillis())
                    .toJobParameters();
            jobLauncher.run(importUserJob, jobParameters);
        }
    };
}

在上面的例子中,我们创建了一个 CommandLineRunner 对象,并在其 run 方法中启动了我们之前创建的 importUserJob job。通过 JobParameters,我们可以传递一些参数给 job 执行,例如时间戳等。

8. 总结

本文介绍了 Spring Batch 的基本应用程序,包括如何创建 job、step,如何读取、处理、写入数据等等。希望读者能够通过本文快速上手 Spring Batch,并在实际项目中灵活应用。