Spring 批处理:在 CompositeItemWriter 中使用 before- 和 after-step 方法
Spring batch: use before- and after-step methods within a CompositeItemWriter
我需要从数据库中读取数据,然后生成一个XLSX文件并更新数据库中的数据。
reader 部分没有问题。
对于编写器部分,我最终创建了一个 CompositeItemWriter
,由生成 XLSX 文件的第一个 Writer
和更新数据库中数据的第二个
组成。
问题:我需要为第一个编写者拦截之前和之后的步骤,以便能够以块的形式正确写入 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 !!
}
}
您需要将 XslWriter 注册为该步骤的侦听器。使用 stepBuilder 的 "listener" 方法。
如果编写器 reader、处理器 "hidden" 位于复合 class 后面,spring 框架将不会自动将其识别为侦听器。因此你必须这样做 "manually".
我需要从数据库中读取数据,然后生成一个XLSX文件并更新数据库中的数据。
reader 部分没有问题。
对于编写器部分,我最终创建了一个 CompositeItemWriter
,由生成 XLSX 文件的第一个 Writer
和更新数据库中数据的第二个
问题:我需要为第一个编写者拦截之前和之后的步骤,以便能够以块的形式正确写入 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 !!
}
}
您需要将 XslWriter 注册为该步骤的侦听器。使用 stepBuilder 的 "listener" 方法。
如果编写器 reader、处理器 "hidden" 位于复合 class 后面,spring 框架将不会自动将其识别为侦听器。因此你必须这样做 "manually".