Из пакетного приложения boot Spring @BeforeStep метод ItemWriter, вызывающий до @BeforeStep метод ItemProcessor

#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 до/после шага, он не видит их как средство чтения/обработки/записи, и порядок их выполнения не обязательно совпадает с тем, как они вызываются на этапе, ориентированном на фрагменты (на самом деле, порядок в этом случае не определен).