【发布时间】:2016-06-04 04:19:32
【问题描述】:
我使用 Spring Boot 创建了一个批处理。这里是批处理的主要配置类:
@Configuration
@EntityScan({"my.domain"})
@EnableJpaRepositories({"my.domain"})
@EnableBatchProcessing
public class BatchConfiguration {
/** Motif d'identification des fichiers d'entrée */
@Value("${batch.input-file-pattern}")
private String inputFilePattern;
@Bean
public BatchConfigurer configurer( EntityManagerFactory entityManagerFactory ){
return new MapForcedBatchConfigurer( entityManagerFactory );
}
@Bean
public Job myJob( JobBuilderFactory jobs, Step step1 ){
return jobs.get("myJob")
.incrementer( new RunIdIncrementer() )
.flow( step1 )
.end()
.build();
}
@Bean
public Step step1( StepBuilderFactory stepBuilderFactory,
StepExecutionListener stepExecutionListener,
ItemReader<Input> myReader,
ItemProcessor<Input, Dto> myProcessor,
ItemWriter<Dto> myWriter ){
return stepBuilderFactory.get("myStep")
.listener( stepExecutionListener )
.<Input, Dto> chunk(1)
.reader( myReader )
.processor( myProcessor )
.writer( myWriter )
.faultTolerant().skipPolicy( new MySkipPolicy() ).retryLimit( 0 )
.build();
}
@Bean
public StepExecutionListener stepListener() {
return new MyStepExecutionListener();
}
@Bean
public ItemReader<Input> myReader() throws IOException {
return new MyItemReader( inputFilePattern );
}
@Bean
public ItemProcessor<Input, Dto> myProcessor(){
return new MyItemProcessor();
}
@Bean
public ItemWriter<Dto> myWriter(){
return new MyItemWriter();
}
}
当处理一个项目发生错误时,记录器会写一条消息,然后批处理处理下一个元素。这正是我想要的。
但是当写入一个项目发生错误时,批处理总是重试一次操作!这样我每个写入错误都有 2 个错误日志。
如何将批处理配置为从不重试错误,无论错误发生在步骤的哪个部分?
This article 解释如下:
[当我们在写入过程中出现跳过时],框架必须找出导致失败的项目。对于缓存的读取项目列表中的每个项目,它都会启动一个自己的事务。项目由 ItemProcessor 处理,然后由 ItemWriter 写入。如果没有错误,则提交包含一项的 mini-chunk,并继续迭代下一项。我们预计至少有一个可跳过的异常,当这种情况发生时,事务将回滚,并且该项目被标记为已跳过的项目。一旦我们的迭代完成,我们就会继续正常的块处理。
这可能是对重新执行写操作的解释。我希望我能以某种方式绕过这种行为......
【问题讨论】:
标签: java spring spring-boot spring-batch