Spring 批 : use before- and after-step methods within a CompositeItemWriter

标签 spring spring-batch

我需要从数据库中读取数据,然后生成一个 XLSX 文件并更新数据库中的数据。

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

问题:我需要为第一个编写器拦截之前和之后的步骤,以便能够以 block 的形式正确写入 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 的“监听器”方法。

如果编写器、读取器、处理器“隐藏”在复合类后面,则 spring 框架不会自动将其识别为监听器。因此您必须“手动”执行此操作。

关于 Spring 批 : use before- and after-step methods within a CompositeItemWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39697529/

相关文章:

java - 上下文混淆 - Spring 实例化单例 bean 两次

java - 使用 Java 配置在 Spring 中重定向 404 错误

java - 如何使用权限保护rest api

java - 在 Spring Batch 中配置多个数据源时出现无法解决的循环引用错误

java - 动态创建作业的 Spring 批量测试

spring-batch - 如何持续运行 Spring Batch 作业

java - 部署 Spring MVC 应用程序以在 Tomcat8 中以根目录运行

css - 外部 CSS 在 Broadleaf 电子邮件模板中不起作用

java - 停止后是否可以重新开始工作?

java - 将本地值作为作业参数传递给作业,同时仍使用 JobParametersIncrementer