当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

面向块的处理

在最常见的实现方式中,Spring Batch 使用的是“面向块”的处理风格。 所谓面向块处理,是指一次读取一条数据,并将若干条数据组成一个“块”, 然后在同一个事务边界内将这一整块写出。当读取的数据项数量达到提交间隔时, 整个块就会由 ItemWriter 一次性写出,随后提交事务。下图展示了这一过程:

面向块的处理
Figure 1. 面向块的处理

下面的伪代码以简化形式展示了同样的概念:

List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
    Object item = itemReader.read();
    if (item != null) {
        items.add(item);
    }
}
itemWriter.write(items);

你也可以为一个面向块的 step 配置可选的 ItemProcessor, 在将数据传给 ItemWriter 之前先对其进行处理。下图展示了在 step 中注册 ItemProcessor 之后的处理流程:

带 ItemProcessor 的面向块处理
图 2. 带 ItemProcessor 的面向块处理

下面的伪代码展示了这一过程的简化实现方式:

List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
    Object item = itemReader.read();
    if (item != null) {
        items.add(item);
    }
}

List processedItems = new Arraylist();
for(Object item: items){
    Object processedItem = itemProcessor.process(item);
    if (processedItem != null) {
        processedItems.add(processedItem);
    }
}

itemWriter.write(processedItems);

关于 item processor 及其使用场景的更多细节,可参见 Item 处理一节。