【问题标题】:Spring batch: use before- and after-step methods within a CompositeItemWriterSpring 批处理:在 CompositeItemWriter 中使用前后步骤方法
【发布时间】:2016-09-26 08:00:49
【问题描述】:

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

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

问题:我需要拦截第一个写入器的前后步骤,以便能够正确地分块写入 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 !!
   }
}

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

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

    如果编写器、读取器、处理器“隐藏”在复合类后面,spring 框架不会自动将其识别为侦听器。因此,您必须“手动”完成。

    【讨论】:

    • 我不记得了。我几乎可以肯定,这在某处有所描述,我也几乎可以肯定这里已经提出了类似的问题。
    • 这里是提到它的参考链接:docs.spring.io/spring-batch/reference/htmlsingle/…。但在我看来,它缺乏明确性:-)。无论如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多