Spring Boot实战:通过Spring Batch处理批量订单数据

引言

Spring Batch 提供了一个强大的基础设施来支持创建健壮的批处理应用。它包括以下关键特性:

  • 可扩展性:可以轻松扩展以适应各种规模的数据集。
  • 事务管理:确保数据完整性,支持重试和回滚机制。
  • 监控和日志:提供了详细的执行报告和日志记录功能。

2. 准备环境

为了构建我们的示例项目,我们需要先设置好开发环境。这里假设你已经安装了 Java 和 Maven,并且熟悉 Spring Boot。

依赖添加

首先,在 pom.xml 文件中添加 Spring Boot Starter Batch 依赖:

复制代码
xml

深色版本

复制代码
1<dependencies>
2    <dependency>
3        <groupId>org.springframework.boot</groupId>
4        <artifactId>spring-boot-starter-batch</artifactId>
5    </dependency>
6    <!-- 其他可能需要的依赖,例如数据库驱动 -->
7</dependencies>

配置文件

在 application.properties 文件中添加数据库连接配置:

复制代码
properties

深色版本

复制代码
1spring.datasource.url=jdbc:mysql://localhost:3306/ordersdb
2spring.datasource.username=root
3spring.datasource.password=password
4spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
5spring.jpa.hibernate.ddl-auto=update

3. 数据模型

我们先定义一个简单的订单实体类:

复制代码
java

深色版本

复制代码
1import javax.persistence.Entity;
2import javax.persistence.GeneratedValue;
3import javax.persistence.GenerationType;
4import javax.persistence.Id;
5
6@Entity
7public class Order {
8    @Id
9    @GeneratedValue(strategy = GenerationType.AUTO)
10    private Long id;
11    private String orderNumber;
12    private String customerName;
13    private double totalAmount;
14
15    // Getters and setters
16}

4. 创建批量任务

接下来,我们将定义一个批量任务来处理订单数据。

Step Configuration

定义一个步骤来读取、处理并写入订单数据:

复制代码
java

深色版本

复制代码
1import org.springframework.batch.core.Step;
2import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
3import org.springframework.batch.item.database.JpaItemWriter;
4import org.springframework.batch.item.file.FlatFileItemReader;
5import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
6import org.springframework.batch.item.file.mapping.DefaultLineMapper;
7import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
8import org.springframework.context.annotation.Bean;
9import org.springframework.context.annotation.Configuration;
10import org.springframework.core.io.ClassPathResource;
11
12@Configuration
13public class BatchConfig {
14
15    @Bean
16    public FlatFileItemReader<Order> orderReader() {
17        FlatFileItemReader<Order> reader = new FlatFileItemReader<>();
18        reader.setResource(new ClassPathResource("orders.csv"));
19        reader.setLineMapper(new DefaultLineMapper<Order>() {{
20            setLineTokenizer(new DelimitedLineTokenizer() {{
21                setNames(new String[] {"orderNumber", "customerName", "totalAmount"});
22            }});
23            setFieldSetMapper(new BeanWrapperFieldSetMapper<Order>() {{
24                setTargetType(Order.class);
25            }});
26        }});
27        return reader;
28    }
29
30    @Bean
31    public JpaItemWriter<Order> orderWriter() {
32        return new JpaItemWriter<>();
33    }
34
35    @Bean
36    public Step step1(StepBuilderFactory stepBuilderFactory) {
37        return stepBuilderFactory.get("step1")
38                .<Order, Order>chunk(10)
39                .reader(orderReader())
40                .writer(orderWriter())
41                .build();
42    }
43}

Job Configuration

定义一个作业来启动步骤:

复制代码
java

深色版本

复制代码
1import org.springframework.batch.core.Job;
2import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
3import org.springframework.context.annotation.Bean;
4import org.springframework.context.annotation.Configuration;
5
6@Configuration
7public class JobConfig {
8
9    @Bean
10    public Job importUserJob(JobBuilderFactory jobBuilderFactory,
11                             Step step1) {
12        return jobBuilderFactory.get("importUserJob")
13                .start(step1)
14                .build();
15    }
16}

5. 运行作业

最后,我们需要一个主类来启动 Spring Boot 应用,并触发作业执行:

复制代码
java

深色版本

复制代码
1import org.springframework.boot.SpringApplication;
2import org.springframework.boot.autoconfigure.SpringBootApplication;
3import org.springframework.context.ConfigurableApplicationContext;
4
5@SpringBootApplication
6public class BatchApplication {
7
8    public static void main(String[] args) throws Exception {
9        ConfigurableApplicationContext context = SpringApplication.run(BatchApplication.class, args);
10        context.getBean(JobLauncher.class).run(context.getBean(Job.class), new JobParameters());
11    }
12}

6. 结论

本教程展示了如何使用 Spring Boot 和 Spring Batch 构建一个简单的批量处理系统,用于导入 CSV 文件中的订单数据到数据库。你可以根据实际业务需求进一步扩展和定制这些组件。

希望这个示例能够帮助你快速入门 Spring Batch,并为你的项目带来价值。如果你有任何问题或反馈,请随时留言!

相关推荐
我是无敌小恐龙3 分钟前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习
做个文艺程序员3 小时前
流式输出(SSE)在 Spring Boot 中的实现【OpenClAW + Spring Boot 系列 第3篇】
java·spring boot·后端
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
QC·Rex3 小时前
Spring AI MCP Apps 实战:打造聊天与富 UI 融合的智能化应用
人工智能·spring·ui·spring ai·mcp
俺爱吃萝卜4 小时前
Spring Boot 3 + JDK 17:新一代微服务架构最佳实践
java·spring boot·架构
Predestination王瀞潞4 小时前
Java EE3-我独自整合(第七章:Spring AOP 通知类型)
python·spring·java-ee
曹牧4 小时前
Spring :component-scan
java·后端·spring
做个文艺程序员4 小时前
Spring Boot 项目集成 OpenClAW【OpenClAW + Spring Boot 系列 第1篇】
java·人工智能·spring boot·开源
曹牧5 小时前
Spring:@RequestMapping
java·后端·spring
霸道流氓气质5 小时前
SpringBoot+LangChain4j+Ollama实现本地大模型语言LLM的搭建、集成和示例流程
java·spring boot·后端