Аннотации до и после шага

#java #spring #spring-batch

#java #весна #spring-пакет

Вопрос:

Я обнаружил проблему с аннотациями BeforeStep и AfterStep в ItemReader. Я надеюсь, что кто-нибудь может дать мне некоторые разъяснения.

Что работает:

У меня есть реализация ItemReader со следующими методами:

  public class ReaderImpl implements ItemReader<String> {

      @BeforeStep
      public void beforeStep(StepExecution stepExecution) {
         //do before step processing...
      }
    
      @Override
      public String read() {
         //do read...
      }

      @AfterStep
      public ExitStatus afterStep(StepExecution stepExecution) {
         //do after step processing...
      }
 }
  

Конфигурация XML:

 <step id="step1">
    <tasklet>
        <chunk reader="readerImpl" writer="writer" commit-interval="100" />
    </tasklet>
</step>

<bean id="readerImpl" class="package.to.ReaderImpl" scope="step"/>
  

Приведенный выше контекст работает просто отлично, и методы BeforeStep и AfterStep выполняются правильно.

Что не работает:

Когда я оборачиваю свой ReaderImpl другим компонентом, spring больше не выполняет методы BeforeStep и AfterStep.

Пример:

 <step id="step1">
    <tasklet>
        <chunk reader="synchronizedReaderImpl" processor="processor" writer="writer" commit-interval="100" />
    </tasklet>
</step>

<bean id="synchronizedReaderImpl" class="org.springframework.batch.item.support.SynchronizedItemStreamReader" scope="step">
    <property name="delegate" ref="readerImpl" />
</bean>
  

Комментарии:

1. Потому что либо ваш readerImp больше не является пошаговым, а скорее одноэлементным (зависит от вашей конфигурации), если это не так, это потому, что он больше не регистрируется автоматически как пошаговый прослушиватель, потому что он не зарегистрирован фактическим читателем.

2. @M.Deinum Итак, компонент с BeforeStep и AfterStep должен быть тем, который определен в фрагменте?

3. @M.Deinum У вас есть ссылка на документацию для этого варианта использования?

4. Тот, который определен в chunkc, зарегистрирован как прослушиватель (и будет работать только в том случае, если есть аннотации или они реализуют интерфейс). Синхронизированный прослушиватель не реализует ни интерфейс, ни аннотации, и не делегирует ни. Вы можете просто зарегистрировать свой reader в качестве слушателя вручную. Для получения дополнительной информации ознакомьтесь со справочным руководством Spring Batch .

5. @M.Deinum У меня есть одна небольшая проблема с подходом к регистрации читателя в качестве слушателя. Это то, что нет гарантии, что слушатель будет выполнен. Если шаг наследует step1, то слушатели не объединяются автоматически.