使用 AggregateItemReader 或其他解决方案在阅读器中进行一次 Spring 批量读取多行

标签 spring spring-batch

我使用 Spring Batch 处理一个包含 300 万行数据的文件。 文件结构如下:

ID1-Adress1-NumberPhone1
ID1-Adress2-NumberPhone2
ID1-Adress3-NumberPhone3
ID2-Adress1-NumberPhone1
ID2-Adress2-NumberPhone2
ID3-Adress1 NumberPhone1
...

我需要通过ID读取文件, 不是逐行的。 例如:
阅读

ID1-Adress2-NumberPhone2
ID1-Adress3-NumberPhone3
ID2-Adress1-NumberPhone1
ID2-Adress2-NumberPhone2

然后创建一个具有 ID 和 a 属性的 Person 对象 Map <String, String> (对于地址,电话号码), 将此对象传递给处理器, 然后读取与第二个 ID 关联的行, 依此类推,直到我有一个 Person 对象列表可以提供给作者。 具体来说, 我需要我的读者在将每个多行对象发送到处理器之前以及在作者将其存储到数据库之前完成它。

我遵循的过程我创建了一个逐行读取的步骤,然后将此行作为对象传递给编写器,在该编写器中,我循环访问具有相同 ID 的那些对象,并将它们映射(写入)到另一个对象中是我的完整对象,然后第二步采用完整对象的最终列表读取它并将其插入数据库,问题是第一步花费的时间超过 2H

阅读器中有方法、聚合过程吗?我试着看这个例子 https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/多行,但我根本不明白我需要一个简单的具体例子来适应上面引用的文件格式

最佳答案

你可以看看multiline sample .在此示例中,input file具有以下格式(与您的情况类似):

BEGIN
INFO,UK21341EAH45,customer1
AMNT,978,98.34
END
BEGIN
INFO,UK21341EAH46,customer2
AMNT,112,18.12
END
...

自定义阅读器用于聚合跨越多行的项目。在此示例中,(逻辑)项由 BEGINEND(物理)记录分隔。你可以看看MultilineTradeItemReader并根据您的情况进行调整。

希望这对您有所帮助。

关于使用 AggregateItemReader 或其他解决方案在阅读器中进行一次 Spring 批量读取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929122/

相关文章:

Spring Row 被另一个事务更新或删除(或未保存的值映射不正确)

java - 多进程批量申请

java - Spring Batch Item Reader 只执行一次

java - CPU 限制会导致 k8s 中的 OOMKilled 状态吗?

spring-batch - 如何使用 Spring Batch 进行聚合?

java - 配置自定义 HibernateItemWriter 时获取 "Either HibernateOperations or SessionFactory must be provided"

spring-batch - 如何通过ItemWriter向多个表中插入数据

Spring Cloud的@RefreshScope导致 Controller 映射与其自身冲突

java - 我们可以使用http代码422(不可处理的实体)进行Get操作吗?

spring - Hikari 和借用选项测试