【问题标题】:Spring-Batch How skip exceptions works for composite writersSpring-Batch 如何跳过异常对复合编写器起作用
【发布时间】:2020-09-30 20:11:39
【问题描述】:

我正在使用 Spring Batch,我的步骤配置如下:

 @Bean
  public Step testStep(
      JdbcCursorItemReader<TestStep> testStageDataReader,
      TestStepProcessor testStepProcessor,
      CompositeItemWriter<Writer> testWriter,
      PlatformTransactionManager transactionManager,
      JobRepository jobRepository) {
    return stepBuilderFactory
        .get("TESTING")
        .<>chunk(100)
        .reader(testStageDataReader)
        .processor(testStepProcessor)
        .writer(testWriter)
        .faultTolerant()
        .skip(DataIntegrityViolationException.class)
        .skipLimit(1)
        .listener(new SkipTestListener())
        .transactionManager(transactionManager)
        .repository(jobRepository)
        .build();
  }

我的复合项目编写器


 @Bean
  public CompositeItemWriter<Writer> testWriter(
      Writer1 writer1,
      Writer2 writer2,
      Writer3 writer3)
      throws Exception {
    List<ItemWriter<? super Writer>> writers = new ArrayList<>();
    writers.add(writer1);
    writers.add(writer2);
    writers.add(writer3);
    CompositeItemWriter<Writer> writers = new CompositeItemWriter<>();
    workingWellDailyMemberAggWriter.setDelegates(writers);
    workingWellDailyMemberAggWriter.afterPropertiesSet();
    return writers;
  }


现在,如果 writer1 上出现 DataIntegrityViolationException,则会在我进行日志记录的地方调用我的跳过侦听器,然后控制转到下一步

我正在寻找一种将控制权转移到当前被跳过的下一个作家的方式

【问题讨论】:

  • 不要抛出异常。抓住它并扔一个物体。但是,如果在处理一个项目的过程中发生错误,该批次应该转到下一个项目进行处理。
  • 我有 3 个按顺序调用的编写器。如果编写器 1 发生异常,我希望调用编写器 2 和 3。现在,如果我有 1 条记录并且发生异常,则不会调用 writer 2 和 3。
  • 好的。所以将这些作家提取到一个单独的过程中。或将所有编写业务逻辑添加到一个编写器中。

标签: java spring spring-batch spring-batch-admin spring-batch-job-monitoring


【解决方案1】:

这种类型的编排需要通过您自己的复合ItemWriter 来完成。 Spring Batch 没有开箱即用的组件来处理单个组件逻辑中的异常。

【讨论】:

猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2020-04-04
  • 2017-10-14
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多