我需要从数据库读取数据,然后生成 XLSX 文件并更新数据库中的数据。
对于读者部分来说没有问题。
对于作家部分,我最终创建了一个CompositeItemWriter
,由第一个组成Writer
生成 XLSX 文件和更新数据库中数据的第二个文件。
问题:我需要拦截第一个编写器的前后步骤,以便能够正确地分块写入 XLSX 文件。但是,一旦我将两位作家写成一个CompositeItemWriter
,方法注释为@BeforeStep
et @AfterStep
不被调用。
让第一个作家实现时遇到同样的问题StepExecutionListener
.
知道为什么吗?
下面是 CompositeItemWriter 的定义、步骤和 writer:
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的“监听器”方法。
如果编写器、读取器、处理器“隐藏”在复合类后面,则 spring 框架将不会自动将其识别为侦听器。因此你必须“手动”进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)