Я создал пакетное приложение, которое выполняет обработку чанка. Я создаю куски, используя политику завершения.
Ниже приведена моя пакетная конфигурация (при минимальном коде, пожалуйста, дайте мне знать, если вам нужна другая информация)
@Bean
public Job myJob() {
ItemReader itemReader = itemReader();
return jobBuilder.get("job").start(myStep(itemReader, completionPolicyReader(itemReader), writer(), processor()));
}
@Bean
public Step myStep(ItemReader itemReader, MyCompletionPolicy completionPolicyReader, ItemWriter writer, ItemProcessor processor) {
return stepBuilder.get("step").chunk(completionPolicyReader).reader(completionPolicyReader).processor(processor).writer(writer).listener(itemReader).build(); // registered delegated itemReader to listener.
}
@Bean
public MyCompletionPolicy completionPolicyReader(ItemReader itemReader) {
MyCompletionPolicy obj = new MyCompletionPolicy();
obj.setDelegate(itemReader);
return obj;
}
@Bean
public ItemReader itemReader() {
abc === xyz ? new AReader() : new BReader();
}
// other config
Ниже приводится мой MyCompletionPolicy
, который делегируется фактическому ItemReader
, т. Е. Либо AReader
, либо BReader
в зависимости от некоторых условий.
class MyCompletionPolicy extends
CompletionPolicySupport implements ItemReader<MyModel>, StepExecutionListener {
public void setDelegate(ItemReader<MyModel> itemReader) {
this.itemReader = itemReader;
this.delegate = new SingleItemPeekableItemReader<MyModel>();
this.delegate.setDelegate(itemReader);
}
@Override
public MyModel read() {
currentReadItem = delegate.read(); // Here I am delegating to actual reader (ex AReader) where I cannot get `StepExecution`
return currentReadItem;
}
.... // Other overridden methods
}
Вот мой AReader
, куда я не могу попасть StepExecution
class AReader implements ItemReader<MyModel>, StepExecutionListener {
@Override
public void beforeStep(StepExecution stepExecution) {
// stepExecution is NULL
}
.... // other overridden methods
}
Как я могу получить stepExecution в моем делегированном ItemReader, т.е. в AReader.
====== EDIT =====
Подвопрос относительно лучших практик. Если я хочу увеличить счетчик между кусками, т.е., например, между несколькими вызовами ItemReader и использовать текущее значение счетчика в ItemReader. Рекомендуется ли создавать поле класса в классе ItemReader или хранить его в ExecutionContext?
- С учетом приложения SingleThread
- Учитывая приложение MultiThread