【发布时间】: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