Обновление обработанного элемента в 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();