Как получить StepExecution в делегированном ItemReader в Spring Batch - PullRequest
0 голосов
/ 17 апреля 2019

Я создал пакетное приложение, которое выполняет обработку чанка. Я создаю куски, используя политику завершения.

Ниже приведена моя пакетная конфигурация (при минимальном коде, пожалуйста, дайте мне знать, если вам нужна другая информация)

@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?

  1. С учетом приложения SingleThread
  2. Учитывая приложение MultiThread

1 Ответ

1 голос
/ 17 апреля 2019

По умолчанию Spring Batch автоматически регистрирует ваше устройство чтения / обработки / записи как слушатели, если они реализуют StepExecutionListener. В вашем случае читатель MyCompletionPolicy, который реализует StepExecutionListener и будет автоматически зарегистрирован как слушатель.

Однако Spring Batch не знает, что ваш MyCompletionPolicy делегирует другому читателю, поэтому вам нужно явно зарегистрировать ваш делегат в качестве слушателя на шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...