我需要从db读取数据,然后生成XLSX文件并更新db中的数据。
对读者来说没有问题。对于作者部分,我创建了一个CompositeItemWriter,它由第一个生成XLSX文件的Writer和更新db中数据的第二个Writer组成。
问题:我需要拦截第一个作者的前后步骤,以便能够以块的形式正确地写入XLSX文件。但是,一旦我将两个作者组合到一个CompositeItemWriter中,就不会调用带有@BeforeStep et @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 !!
}
}发布于 2016-09-26 09:03:12
您需要将XslWriter注册为步骤的侦听器。使用stepBuilder的“侦听器”方法。
如果编写器、读取器、处理器在复合类后面“隐藏”,spring框架将不会自动识别它为侦听器。因此,你必须“手动”去做。
https://stackoverflow.com/questions/39697529
复制相似问题