Код: Выделить всё
GROUP_NAME,ENTITY_NAME,DATA,ADDITIONAL_DATA
group_1,Foo book,"{""paperback"" : true}","{""digital"":false}"
group_999,Bar book,,
group_1,Foo book,"{""edition"":5}"
ID
ENTITY_NAME
DATA
ADDITIONAL_DATA
1
Foo book
{"мягкая обложка": правда, "издание": 5}
{"цифровой": ложь
Spring Batch предоставляет способ разбить входные данные на разделы перед запуском задания, а затем обработать их по частям, но его нельзя применить к этому варианту использования, поскольку записи, принадлежащие одному и тому же GROUP_NAME, являются динамическими и секционирование невозможно использовать. Кроме того, записи, принадлежащие одному и тому же GROUP_NAME, могут охватывать несколько фрагментов, и фрагменты обрабатываются независимо.
Как сгруппировать записи в Spring Batch 5.x, чтобы каждый поток/выполнение был предназначен для одной группы записей, обработка на основе фрагментов не подходит для этого варианта использования, и у меня также есть ограничение, заключающееся в том, что нельзя использовать промежуточную таблицу базы данных (в которую можно было бы загрузить содержимое CSV, а затем было бы предложение GROUP BY) помогло).
Один из способов решить эту проблему:
- Отсортировать строки в CSV-файле на основе поля GROUP_NAME (да, это будет дорого, и сортировка на уровне операционной системы, похоже, будет производительной)
- Используйте SingleItemPeekableItemReader для чтения строк, сбора записей(строк) до тех пор, пока в GROUP_NAME не будет обнаружено изменение
Подробнее здесь: https://stackoverflow.com/questions/798 ... ring-batch
Мобильная версия