如何在Spring Batch中的委托ItemReader中获取StepExecution

时间:2019-04-17 05:50:24

标签: spring spring-boot spring-batch

我创建了执行块处理的批处理应用程序。我正在使用“完成策略”创建块。

以下是我的批处理配置,(尽量减少代码,如果需要其他信息,请告诉我)

@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,即AReaderBReader

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
}

如何在委托的ItemReader中(即在AReader中)获得stepExecution。

======= EDIT =====

有关最佳做法的子问题。如果我想增加块之间的计数,即例如多次调用ItemReader之间的计数并使用ItemReader中计数器的当前值。在ItemReader类中创建类字段是一种好习惯还是应该将其存储在ExecutionContext中?

  1. 考虑SingleThread应用
  2. 考虑MultiThread应用

1 个答案:

答案 0 :(得分:1)

默认情况下,如果Spring Batch实现了StepExecutionListener,它将自动将您的读取器/处理器/写入器注册为侦听器。在您的情况下,读取器是MyCompletionPolicy,它实现了StepExecutionListener,并且将自动注册为侦听器。

但是,Spring Batch并不知道您的MyCompletionPolicy委托给其他读者,因此您需要在该步骤中将您的委托显式注册为侦听器。