📅  最后修改于: 2023-12-03 14:47:32.485000             🧑  作者: Mango
Spring Batch 是一个强大的批量处理框架,可以帮助开发者轻松地编写各种批量任务,并提供大量的工具和接口支持。
本文将介绍 Spring Batch 的基本应用程序,包括如何创建 job、step,如何读取、处理、写入数据等等。
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>
在 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 运行的独立性。
一个 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
方法,我们可以一次性处理多条数据。
数据读取器用于从外部数据源中读取数据,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 对象,并指定了它读取文件的位置及其数据映射方式。
数据写入器用于将数据写入到目标数据源中,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 语句及数据源。
数据处理器用于对数据进行处理,例如过滤、转换等操作。Spring Batch 中的数据处理器需要实现 ItemProcessor 接口,具体实现方式根据需求而定。
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
在上面的例子中,我们创建了一个 PersonItemProcessor 对象,它实现了 ItemProcessor 接口,用于将输入的 Person 对象转换成大写形式。
当所有的 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 执行,例如时间戳等。
本文介绍了 Spring Batch 的基本应用程序,包括如何创建 job、step,如何读取、处理、写入数据等等。希望读者能够通过本文快速上手 Spring Batch,并在实际项目中灵活应用。