跳到主要内容
版本:6.0.2

分块导向处理

DeepSeek V3 中英对照 Chunk-oriented Processing

Spring Batch 在其最常见的实现中采用了“面向块”的处理方式。面向块的处理方式指的是每次读取一条数据,并在事务边界内创建“块”进行写出。当读取的项目数量达到提交间隔时,整个块会通过 ItemWriter 写出,随后事务被提交。下图展示了这一过程:

面向块的处理

图 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);

你也可以配置一个面向块的步骤,并可选地使用 ItemProcessor 在将项目传递给 ItemWriter 之前进行处理。下图展示了在步骤中注册 ItemProcessor 时的处理流程:

面向块的处理与项目处理器

图 2. 使用项目处理器的面向块处理

以下伪代码以简化形式展示了其实现方式:

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);

有关项目处理器及其使用案例的更多详情,请参阅项目处理部分。

章节总结

📄️ 提交间隔

如前所述,一个步骤会读取并写入数据项,并定期使用提供的 PlatformTransactionManager 进行提交。当提交间隔设置为 1 时,它会在写入每个单独的数据项后提交。这在许多情况下并不理想,因为开始和提交事务的成本很高。理想情况下,最好在每个事务中处理尽可能多的数据项,这完全取决于所处理的数据类型以及步骤与之交互的资源。因此,您可以配置在每次提交中处理的数据项数量。

📄️ 配置跳过逻辑

在许多场景中,处理过程中遇到的错误不应导致步骤失败,而应跳过。这通常需要由理解数据本身及其含义的人员来决定。例如,财务数据可能不可跳过,因为它涉及资金转移,需要完全准确。另一方面,加载供应商列表可能允许跳过。如果某个供应商因格式错误或缺少必要信息而未能加载,可能不会造成问题。通常,这些不良记录也会被记录下来,这将在后续讨论监听器时涉及。