Skip to content

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 的知识框架!🎯 下一步建议尝试实际项目应用,体验批处理的强大功能。