【问题标题】:Spring batch read multiline once in the reader using AggregateItemReader or other solutionSpring使用AggregateItemReader或其他解决方案在阅读器中批量读取多行一次
【发布时间】:2019-09-19 14:22:10
【问题描述】:

我使用 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

然后创建一个 Person 对象,其属性为 ID 和 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 但我根本不明白我需要一个简单的具体例子,通过适应上面引用的文件格式

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您提供此解决方案,我将尝试根据我的情况进行调整,我会给您一个回报
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多