Spring Batch的2种STEP定义方式
1. 第一种:基于Chunk-Oriented Processing(read,process,write)形式
适用场景:
- 大数据量批处理:适合需要分批次读取、处理并写入大量数据的场景(如数据库批量更新、文件导入导出)
- 事务敏感操作:每个Chunk(数据块)作为一个独立事务提交,避免长事务导致的资源锁(如数据库锁表)
- 数据流水线处理:需对数据逐条转换、过滤或聚合的场景(如ETL任务)
核心特点:
- 分块处理:通过
chunkSize
控制单次处理的数据量(例如每次读取100条),平衡内存与性能 - 代码量较tasklet重:开发者需实现
ItemReader
ItemProcessor
ItemWriter
接口,且STEP上下文需用到StepExecutionListener
接口;自定义实现类。
@Bean
public Step print1Step(){return stepBuilderFactory.get("updateProductStockQuantityStep").listener(step1StepListener)//步骤监听.<Product, Product>chunk(10)//每批处理数量.reader(step1ItemReader)//读.processor(step1Processor)//处理.writer(step1Writer)//写.build();
}
2. 第二种:基于tasklet形式
适用场景:
- 非数据驱动任务:适合不需要分块处理的原子性操作,如初始化、清理或调用外部服务
- 灵活控制逻辑:需自定义执行流程(如条件分支、循环)的场景
- 单一事务需求:整个Step在一个事务中完成,适合不可拆分的操作(如文件压缩、发送通知)
核心特点:
- 简单接口:仅需实现
execute()
方法,返回RepeatStatus.FINISHED
或CONTINUABLE
支持循环执行) - 全事务控制:整个Tasklet作为单一事务,要么完全成功要么完全回滚
- 无数据分块:不涉及
ItemReader/Processor/Writer
,适合非结构化任务
@Bean(name = {"printOverStep"})
public Step printOverStep(){return stepBuilderFactory.get("step3").tasklet((contribution, chunkContext) -> {...//业务逻辑return RepeatStatus.FINISHED;}).build();
}
RepeatStatus
返回类型有
- CONTINUABLE:表示当前任务尚未完成,需要继续执行下一次迭代(例如处理下一个数据块)
- FINISHED:表示当前任务已执行完毕,终止后续迭代,执行下一个STEP
简单来说:需要继续干活就
CONTINUABLE
,干完了就FINISHED
。