Обновление обработанного элемента в Spring Batch

У меня есть приложение Spring Batch, которое использует ItemProcessor для обработки элементов.

      @Component
@StepScope
public class MemberProcessor<T> implements ItemProcessor<T, Member> {

    @Override
    public Member process(T t) throws Exception {
        return processMember((UnprocessedMember) t);
    }
}

@Component
@StepScope
public class MemberWriter implements ItemWriter<Member> {

    @Override
    public void write(List<? extends Member> members) throws Exception {
        //store the members in db
        saveToDb(members);
    }
}

Я хочу знать, возможно ли обновить элемент после его обработки, чтобы он обновлялся при попадании в ItemWriter. Например, я обрабатываю один элемент, а затем другой, который может потребовать редактирования свойства предыдущего элемента. Поскольку предыдущий элемент не дошел до Writer, я не могу обновить базу данных, и первый элемент записывается без обновления.

1 ответ

Spring Batch предоставляет ItemProcesListener для обработки элемента до того, как элементы будут обработаны модулем записи. Реализации этого интерфейса будут уведомлены до и после передачи элемента в ItemProcessor, а также в случае любых исключений, выданных процессором. Итак, в основном вам нужно создать пользовательский прослушиватель процесса элемента, реализующий ItemProcesListenerи зарегистрируйтесь в задаче установки процессора. Пример:

      public class MyCustomItemProcessListener implements ItemProcessListener<T, R> {

    @Override
    public void beforeProcess(T item) {
        System.out.println("MyCustomItemProcessListener - beforeProcess");
    }

    @Override
    public void afterProcess(T item, R result) {
        System.out.println("MyCustomItemProcessListener - afterProcess");
        // Apply your custom logic to act on the object before write
    }

    @Override
    public void onProcessError(T item, Exception e) {
        System.out.println("MyCustomItemProcessListener - onProcessError");
    }
}

Теперь вы можете добавить слушателя на свой шаг. Это зависит от ваших определений и конфигураций Step. Но по сути что-то вроде ниже.

      StepBuilderFactory.get("Stepx")
...
.processor(someProcessor).listener(new MyCustomItemProcessListener())
...

Или же

      steps.get("stepx")
            .tasklet(new MyProcessorTask())
            .listener(new MyCustomItemProcessListener())
            .build();
Другие вопросы по тегам