【发布时间】: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