Appearance
Spring Batch 核心概念详解
TIP
学习建议:本文是 Spring Batch 的术语词典,建议搭配实际案例学习。理解这些概念将帮助你掌握批处理的核心思想!
一、批处理基础概念
1. 批处理 (Batch)
⚡️ 定义:指积累一段时间的业务事务集合。
💡 示例:每天凌晨处理的订单结算、每月生成的财务报表等。
2. 批处理窗口 (Batch Window)
⏱️ 定义:批处理作业必须完成的时间范围。
⚠️ 约束因素:
- 系统上线时间限制
- 依赖作业的执行顺序
- 资源可用性(如数据库维护窗口)
3. 批处理类型 (Batch Job Type)
📊 常见分类:
类型 | 说明 | 应用场景 |
---|---|---|
接口处理 | 处理平面文件 | 银行对账文件处理 |
表单处理 | PDF生成/打印 | 发票批量打印 |
报表处理 | 数据分析 | 销售月报生成 |
二、核心处理单元
1. 步骤 (Step)
🧩 定义:批处理的基本工作单元,包含:
- 业务逻辑初始化
- 事务环境控制
- 数据处理流程
kotlin
@Bean
fun importUserStep(): Step {
return stepBuilderFactory.get("importUserStep")
.chunk<User, User>(100) // [!code highlight] // 每100条数据提交一次
.reader(flatFileItemReader())
.processor(userProcessor())
.writer(jdbcBatchItemWriter())
.faultTolerant()
.skipLimit(10) // [!code warning] // 最大跳过10条错误数据
.skip(ValidationException::class.java)
.build()
}
2. 任务块 (Tasklet)
🛠️ 定义:开发者创建的业务逻辑处理组件,用于实现步骤的具体功能。
kotlin
@Bean
fun cleanupTask(): Tasklet {
return Tasklet { contribution, _ ->
// 执行清理操作
jdbcTemplate.execute("TRUNCATE TABLE temp_users")
RepeatStatus.FINISHED
}
}
kotlin
@Bean
fun processReportsTask(): Tasklet {
return Tasklet { contribution, chunkContext ->
val params = contribution.stepExecution.jobParameters
val date = params.getDate("processDate")
// 复杂报表生成逻辑
generateSalesReport(date)
RepeatStatus.FINISHED
}
}
3. 逻辑工作单元 (LUW)
🔢 定义:批处理作业中单次迭代处理的工作单元。
💡 特点:
- 驱动查询返回的每条记录都是一个LUW
- 是事务管理的基本单位
三、数据处理机制
1. 驱动查询 (Driving Query)
🔍 定义:识别需要处理的数据集的查询语句。
✅ 最佳实践:
sql
SELECT id FROM orders
WHERE status = 'PENDING'
AND processed = false -- [!code highlight] // 确保重启时只处理未处理记录
2. 数据项 (Item)
📦 定义:最小数据单元(文件中的一行、数据库中的一条记录等)。
3. 提交间隔 (Commit Interval)
💾 定义:单个事务中处理的LUW数量。
⚠️ 配置建议:
kotlin
.chunk<Order, Order>(50) // [!code highlight] // 每50条数据提交一次事务
CAUTION
过大间隔会导致内存溢出,过小间隔会降低性能!
四、高级处理策略
1. 分区处理 (Partitioning)
🌐 定义:将作业分割到多个线程/JVM中并行处理。
2. 暂存表 (Staging Table)
🗂️ 定义:处理过程中存储临时数据的数据库表。
✅ 使用场景:
- 数据清洗和转换
- 中间结果存储
- 错误数据处理
五、作业控制特性
1. 可重启 (Restartable)
🔄 定义:作业可以重新执行并保持相同作业实例ID。
2. 可重跑 (Rerunnable)
♻️ 定义:可重启作业能管理自身状态,避免重复处理。
实现技巧
在驱动查询中添加状态过滤条件:
sql
SELECT * FROM orders
WHERE status = 'PROCESSING'
AND last_processed_date < CURRENT_DATE - 1 // [!code highlight]
六、错误处理机制
1. 重试 (Retry)
🔄 定义:操作失败后自动重新尝试的机制。
⚡ 适用场景:临时性错误(网络抖动、资源锁竞争等)
kotlin
.retryLimit(3) // [!code highlight] // 最大重试次数
.retry(DeadlockLoserDataAccessException::class.java)
2. 恢复 (Recover)
🩹 定义:异常处理后继续执行的恢复策略。
3. 跳过 (Skip)
⏭️ 定义:忽略无效记录继续处理的策略。
💡 典型应用:文件处理中的格式错误行
kotlin
.skipPolicy { throwable, skipCount ->
throwable is FlatFileParseException && skipCount < 10
}
IMPORTANT
批处理黄金法则:始终设计幂等操作,确保作业可安全重启!
七、核心操作类型
1. 重复 (Repeat)
🔁 定义:循环执行代码块直到完成或出错。
💡 本质:while(hasInput && noError){ process() }
2. 完整处理流程示例
通过掌握这些核心概念,你已经建立了 Spring Batch 的知识框架!🎯 下一步建议尝试实际项目应用,体验批处理的强大功能。