Spring (57)Spring Batch

Spring Batch 是一个轻量级、全面的批处理框架,用于开发企业级的批处理应用程序。它是为了实现大批量数据的处理而设计的,提供了强大的功能来支持复杂的业务需求。Spring Batch提供了事务管理、作业处理统计、作业重启、跳过、资源管理等功能,这使得它可以处理大规模的数据集。

核心概念

在深入Spring Batch之前,首先了解其核心概念是很重要的:

  • Job(作业):表示批处理过程中的一次完整的执行,由一个或多个步骤组成。
  • Step(步骤):作业的一个独立阶段,包括读取数据、处理数据和写入数据三个部分。
  • ItemReader(读取器):用于从数据源读取数据。
  • ItemProcessor(处理器):处理业务逻辑,对数据进行转换。
  • ItemWriter(写入器):将处理后的数据写入到目的地。

示例:CSV文件到数据库的数据导入

下面的例子展示了如何使用Spring Batch读取一个CSV文件中的数据,并将数据导入到数据库中。

1. 添加依赖

首先,需要在pom.xml中添加Spring Batch的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
    <!-- 其他依赖 -->
</dependencies>
2. 配置作业

接下来,需要配置作业。在Spring配置类中定义作业和步骤:

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1(ItemReader<Person> reader,
                       ItemProcessor<Person, Person> processor,
                       ItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
                .<Person, Person> chunk(10)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }
}
3. 定义读取器、处理器和写入器

然后,定义读取器、处理器和写入器:

@Bean
public FlatFileItemReader<Person> reader() {
    return new FlatFileItemReaderBuilder<Person>()
        .name("personItemReader")
        .resource(new ClassPathResource("sample-data.csv"))
        .delimited()
        .names(new String[]{"firstName", "lastName"})
        .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }})
        .build();
}

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

@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();
}
4. 运行作业

最后,可以通过实现CommandLineRunner接口来启动作业:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job importUserJob;

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

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

这个例子定义了一个简单的作业importUserJob,它包含一个步骤step1。这个步骤将使用FlatFileItemReader读取CSV文件中的数据,通过PersonItemProcessor处理数据,最后通过JdbcBatchItemWriter将数据写入数据库。

总结

Spring Batch提供了一个强大的框架来支持复杂的批处理作业,通过定义作业、步骤和相应的读取器、处理器、写入器,可以灵活地处理各种批处理需求。上述例子只是展示了它的基本用法,实际应用中还可以使用更多高级特性,如作业监听器、决策器、流程控制等,来构建更加复杂和强大的批处理应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值