跳到主要内容

块导向处理

QWen Plus 中英对照 Chunk-oriented Processing

Spring Batch 在其最常见的实现中使用了“分块处理”的处理方式。分块处理指的是每次读取一条数据,并在事务边界内创建并写入 'chunks'(数据块)。一旦读取的项目数量等于提交间隔,整个数据块就会由 ItemWriter 写出,然后事务被提交。下图展示了该过程:

Chunk Oriented Processing

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

你还可以通过可选的 ItemProcessor 配置一个基于块的步骤,在将项目传递给 ItemWriter 之前对其进行处理。下图显示了在步骤中注册 ItemProcessor 时的过程:

使用 Item Processor 的分块定向处理

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

如需了解更多关于项目处理器及其用例的详细信息,请参阅 Item processing 部分。

小节摘要

📄️ 提交间隔

如前所述,一个步骤(step)通过提供的 PlatformTransactionManager 读取和写入项目,并定期提交。当 commit-interval 设置为 1 时,它会在写入每个单独的项目后提交。在许多情况下,这种方式并不理想,因为开始和提交事务的成本较高。理想情况下,最好在每次事务中处理尽可能多的项目,而这完全取决于所处理的数据类型以及步骤与之交互的资源。因此,您可以配置每次提交时处理的项目数量。

📄️ 配置跳过逻辑

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