#java #spring #spring-batch #spring-batch-tasklet
#java #весна #spring-batch #spring-batch-tasklet
Вопрос:
У меня есть приложение для Spring batch, я использовал программирование, ориентированное на блоки, в котором я расширил класс FlatFileItemWriter для генерации выходного файла.
Проблема в том, что у меня будет более 1000 записей в качестве входных данных, а значение блока равно 100. Таким образом, 10 раз будет вызван customFlatFileItemWriter . Но проблема в том, что каждая запись взаимосвязана, я должен проверить предыдущий идентификатор со следующим идентификатором записи.
Ввод в пакет
123, sample1
123, sample2 // Here I have to check 123 is same as 123 which is previous id
124, sample3 // Here I have to check 124 is same as 123 which is previous id
125, sample4 // Here I have to check 125 is same as 124 which is previous id
Для этого, если блок завершается с id — 124, мы не можем получить идентификатор записи ‘124’ при выполнении манипуляций с идентификатором записи ‘125’.
В StepExecution мы можем сохранить объект в выполнении и перейти к следующей задаче, но здесь, в этом сценарии, мы не получаем StepExecution, так что в любом случае можно получить объект для следующей манипуляции с блоком.
Код моего пользовательского FlatFileItemWriter
public class FileIW<T> extends FlatFileItemWriter<T> {
@Override
public String doWrite(List<? extends T> items) {
StringBuilder lines = new StringBuilder();
for (T item : items) {
User user = (User)item;
System.out.println(user.getId());
lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
}
return lines.toString();
}
}
Комментарии:
1.
To do that if chunk completes at id - 124, then we can't get the record id '124' while doing the manipulation of record id '125'.
: Где вы выполняете эту манипуляцию? У вас есть обработчик элементов? Как вы справляетесь с этой ситуацией внутри одного и того же блока (а не между блоками)?2. Привет, Махмуд Бен Хассин, на самом деле у меня нет процессора элементов, в принципе, мы можем выполнить эту операцию либо в processor, либо в writer. Но не уверен, как временно сохранить I’d, когда выполнение происходит между фрагментами. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи.
3. Вы должны сделать это в процессоре элементов, обработка / преобразование данных является типичным вариантом использования для процессора элементов. Что вы можете попытаться сделать, так это сохранить элементы (или только их идентификаторы) в контексте выполнения, чтобы вы могли получить к ним доступ в последующих блоках.
4. @MahmoudBenHassine Можем ли мы хранить объемные данные в контексте выполнения? Рекомендуется ли это делать?