Получение предыдущих значений фрагмента для текущего пакета обработки — spring batch

#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 Можем ли мы хранить объемные данные в контексте выполнения? Рекомендуется ли это делать?