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

时间:2019-04-30 21:53:35

标签: 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

然后创建一个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/多行,但是我完全不理解,我需要一个简单的具体示例来适应上面引用的文件格式

1 个答案:

答案 0 :(得分:1)

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

document.getElementById("zlomok2").innerHTML = "<p>$$F(s) = {{"+citatelX+"} \\over {"+menovatelX+"}}$$</p>";

自定义阅读器用于汇总跨越多行的项目。在此示例中,(逻辑)项由BEGIN INFO,UK21341EAH45,customer1 AMNT,978,98.34 END BEGIN INFO,UK21341EAH46,customer2 AMNT,112,18.12 END ... BEGIN(物理)记录定界。您可以查看MultilineTradeItemReader并使其适应您的情况。

希望这会有所帮助。