У меня есть шаг, где мне нужно прочитать некоторые строки из таблицы db и для каждой строки записать запись (например, в последовательном файле, но это не должно быть важно).Сценарий записи весны: добавьте запись терминатора после группы записей
Каждая строка принадлежит группе и после обработки всех строк одной группы мне нужно добавить «запись о завершении» с некоторой информацией, такой как количество записей для этой группы (я могу сортировать при чтении, чтобы гарантировать, что все строки одна и та же группа смежна).
Я пытался сделать это, реализующий интерфейс ItemStreamWriter, сохраняя последнюю группу написанную в собственности и писать записи о прекращении до того пункта другой группы написано:
private Group group = null;
public void write(List<? extends Record> data) {
for (Record item : data) {
if(group==null) {
group = item.getGroup();
} else if(!group.equals(item.getGroup())) {
addTeminationRecord(group);
group = item.getGroup();
}
addRegularRecord();
}
}
Проблема заключается в том, что я не знаю, когда писать последнюю запись о завершении. Я думал о методе «закрыть», но там я не знаю, закрыт ли поток, потому что стержень завершен или после неудачи.
Другое решение, которое я рассмотрел, - это использовать читателя для загрузки целых групп (ItemReader) с списком записей в качестве свойства группы. Проблема заключается в том, что количество записей в группе действительно велико, и запись включает в себя много данных, и это может вызвать различные проблемы (память, слишком большая потеря работы, если транзакция должна быть отклонена, ecc.)
Есть ли другой способ получить то, что мне нужно?
UPDATE: Мне нужно добавить запись о завершении только в том случае, если обработана последняя запись группы. В моем понимании нижний колонтитул FlatFileItemWriter всегда записывает нижний колонтитул даже в случае прерывания выполнения шага. Я прав?