2013-07-09 1 views
0

У меня есть шаг, где мне нужно прочитать некоторые строки из таблицы 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 всегда записывает нижний колонтитул даже в случае прерывания выполнения шага. Я прав?

ответ

0

Вы правы, нижний колонтитул FlatFileItemWriter всегда будет вызываться, даже если есть ошибка при записи записей. Вы можете передать переменную «группа» в обратный вызов нижнего колонтитула (например, через ItemStream), и обратный вызов может ссылаться на последнюю «группу» и писать, если она не равна нулю. Поэтому вам не нужно заботиться/определять последнюю группу до начала написания.

Альтернатива: После вашей текущей настройки, я думаю, если вам удастся получить количество записей, которые вы ожидаете прочитать. Используя этот счет, сообщите своему писателю, чтобы он знал, когда писать последнюю запись о завершении.

 Смежные вопросы

  • Нет связанных вопросов^_^