Spring批处理:在CompositeItemWriter

时间:2016-09-26 08:00:50

标签: spring-batch

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

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

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

制作第一个编写器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 !! } } 时的相同问题。

知道为什么吗?

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

<div style="height: 100%; display: flex; align-items: center; justify-content: center;">

  <div>
    Some vertical and horizontal aligned text
  </div>

</div>

1 个答案:

答案 0 :(得分:3)

您需要将XslWriter注册为该步骤的侦听器。使用&#34;听众&#34; stepBuilder的方法。

如果作家,读者,处理器被隐藏&#34;在复合类后面,spring框架不会自动将其识别为侦听器。因此,您必须手动操作&#34;。