#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, то слушатели не объединяются автоматически.