#java #spring-boot #spring-batch
Вопрос:
Я изучаю SpringBatch, у меня проблема во время загрузки Spring, вызывающего ItemWriter перед ItemProcessor. Почему?
public class PollingReader implements ItemReader<File> {
@BeforeStep
public void beforeStep(StepExecution stepExecution) throws NotDirectoryException {..}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution) {..}
}
public class PollingWriter implements ItemWriter<File> {
@BeforeStep
public void beforeStep(StepExecution stepExecution) {..}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution) {..}
..
}
public class PollingProcessor implements ItemProcessor<File, File> {
@BeforeStep
public void beforeStep(StepExecution stepExecution) {..}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution) {..}
}
И метод @AfterStep ItemProcessor вызывается до метода @AfterStep ItemWriter.
Я ожидал, что этот цикл вызовет @BeforeStep:
- Считыватель предметов
- ItemПроцессор
- Автор статей
но у меня есть такой результат:
- Считыватель предметов
- Автор статей
- ItemПроцессор
и для @AfterStep я ожидал:
- Автор статей
- ItemПроцессор
- Считыватель предметов.
но у меня есть такой результат:
- ItemПроцессор
- Автор статей
- Считыватель предметов
Спасибо 🙂
Ответ №1:
Ваши объекты полиморфны: они являются одновременно устройством чтения/обработки/записи элементов и StepExecutionListener
s (точнее, прокси-серверами). Когда пакет Spring запускает StepExecutionListeners до/после шага, он не видит их как средство чтения/обработки/записи, и порядок их выполнения не обязательно совпадает с тем, как они вызываются на этапе, ориентированном на фрагменты (на самом деле, порядок в этом случае не определен).