Spring 批处理:在 CompositeItemWriter 中使用 before- 和 after-step 方法

Spring batch: use before- and after-step methods within a CompositeItemWriter

我需要从数据库中读取数据,然后生成一个XLSX文件并更新数据库中的数据。

reader 部分没有问题。 对于编写器部分,我最终创建了一个 CompositeItemWriter,由生成 XLSX 文件的第一个 Writer 和更新数据库中数据的第二个

组成。

问题:我需要为第一个编写者拦截之前和之后的步骤,以便能够以块的形式正确写入 XLSX 文件。但是,一旦我将两个编写器组合成 CompositeItemWriter,就不会调用用 @BeforeStep@AfterStep 注释的方法。

让第一个编写器实现时出现同样的问题 StepExecutionListener

知道为什么吗?

下面是 CompositeItemWriter 定义、步骤和编写器:

public CompositeItemWriter<Adhesion> compositeItemWriter() {
  CompositeItemWriter writer = new CompositeItemWriter();
  writer.setDelegates(Arrays.asList(adhesionToXlsWriter,  adhesionToDbWriter));
  return writer;
}

@Bean
public Step xlsStep(ItemReader<Adhesion> adhesionFromDbReader) {
   return stepBuilderFactory.get(JOB_NAME + "-step")
      .<Adhesion, Adhesion>chunk(10)
      .reader(adhesionFromDbReader)
      .writer(compositeWriter())
      .build();
   }


@Component
public class AdhesionToXlsWriter implements ItemWriter<Adhesion> {

   @BeforeStep
   public void beforeStep(StepExecution stepExecution) {
      // !! never called !!
   }

   @Override
   public void write(List<? extends Adhesion> items) throws Exception {
      // generate XLSX content
   }

   @AfterStep
   public ExitStatus afterStep(StepExecution stepExecution) {
      // !! never called !!
   }
}

您需要将 XslWriter 注册为该步骤的侦听器。使用 stepBuilder 的 "listener" 方法。

如果编写器 reader、处理器 "hidden" 位于复合 class 后面,spring 框架将不会自动将其识别为侦听器。因此你必须这样做 "manually".