1. 概述
Spring Batch提供了多种方式用于处理并行,提高性能。主要分为2大类:
- 单个进程,多线程
- 多个进程
因此,可以细分为以下几类:
- 多线程Step(Multi-thread Step,single process)
- 并行Step(Parallel Steps, single process )
- Remote Chunking of Step( multi process)
- Partitioning a step(single or multi process)
2. Multi-Thread Step
最直接的方式是给Step配置一个TaskExecutor
<step id="loading">
<tasklet task-executor="taskExecutor">...</tasklet>
</step>
此时,taskExecutor的线程并行来执行Item处理(统一item的read,process,write在同一个线程中执行)。可以限制TaskExecutor的阈值(默认为4):
<step id="loading"> <tasklet
task-executor="taskExecutor"
throttle-limit="20">...</tasklet>
</step>
需要注意的是,在多线程Step中,需要确保Reader、Processor和Writer是线程安全的,否则容易出现并发问题。Spring Batch提供的大部分组件都是非线程安全的,他们都保存有部分状态信息,主要是为了支持任务重启。
因此,使用多线程Step的核心任务是实现无状态化,例如不保存当前读取的item的cursor,而是同item的flag字段来区分item是否被处理过,已经被处理过的下次重启的时候,直接被过滤掉。
多线程Step实现的是单个Step的多线程化。
3. Parallel Steps
如果多个Step没有先后关系,可以并行执行,这是通过split和flow来实现的:
<job id="job1">
<split id="split1" task-executor="taskExecutor" next