Spring пакетное чтение многострочного один раз в читателе с помощью AggregateItemReader или другого решения - PullRequest
0 голосов
/ 01 мая 2019

Я использую Spring Batch для обработки файла с 3 миллионами строк данных.Файл структурирован следующим образом:

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

Мне нужно читать файл по идентификатору, а не построчно.Например:
read

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

, затем создайте объект Person, имеющий в качестве атрибутов идентификатор и Map <String, String> (для адреса, numberPhone), передайте этот объект процессору, затем прочитайте связанные строкисо вторым идентификатором и т. д., пока у меня не будет объекта List of Person, который можно передать автору записи.В частности, мне нужно, чтобы мой читатель завершил каждый многострочный объект перед его отправкой в ​​процессор и до того, как писатель сохранит его в базе данных.

Процесс, которому я следовал, создал шаг, который затем читает построчнопередает эту строку как объект автору, в этом авторе я зацикливаюсь на тех объектах, имеющих тот же идентификатор, и я сопоставляю их (записываю) в другом объекте, который является моим полным объектом, затем второй шаг, который принимает этот окончательный список завершенных объектовчитает его и вставляет в базу данных, проблема в том, что этот шаг занимает больше времени, чем 2H для 1-го шага

есть ли метод, процесс агрегации в считывателе?Я попытался увидеть этот пример https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/ в несколько строк, но я совсем не понял, мне нужен простой конкретный пример, адаптируясь к формату файла, приведенному выше

1 Ответ

1 голос
/ 01 мая 2019

Вы можете взглянуть на многострочный образец . В этом примере входной файл имеет следующий формат (который похож на ваш случай):

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

Пользовательский ридер используется для объединения элементов, которые занимают несколько строк. В этом примере (логический) элемент разделяется записями BEGIN и END (физическими). Вы можете взглянуть на MultilineTradeItemReader и адаптировать его к вашему делу.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...