重试不使用Java配置的Spring批处理

重试不使用Java配置的Spring批处理,java,spring-boot,spring-batch,spring-retry,Java,Spring Boot,Spring Batch,Spring Retry,我有以下配置的Spring批处理作业: @Bean public Job myJob(Step step1, Step step2, Step step3) { return jobs.get("myJob").start(step1).next(step2).next(step3).build(); } @Bean public Step step1(ItemReader<String> myReader, ItemProcessor<

我有以下配置的Spring批处理作业:

@Bean
public Job myJob(Step step1, Step step2, Step step3) {
    return jobs.get("myJob").start(step1).next(step2).next(step3).build();
}

@Bean
public Step step1(ItemReader<String> myReader,
                ItemProcessor<String, String> myProcessor,
                ItemWriter<String> myWriter) {
    return steps.get("step1").<String, String>chunk(1)
            .reader(myReader)
            .faultTolerant().retryLimit(3).retry(MyException.class)
            .processor(myProcessor)
            .writer(myWriter)
            .build();
}

@Bean
@StepScope
public MyReader myReader() {
    return new MyReader();
}
@Bean
public MyProcessor myProcessor() {
    return new MyProcessor();
}
@Bean
public MyWriter myWriter() {
    return new MyWriter();
}

从2.2.0开始,重试功能似乎已从Spring批处理中退出。它现在是一个新库SpringRetry的一部分。

使用声明性重试处理此问题的步骤:

第1步: 在应用程序中包括
@enablerery

速度2: 根据添加aop启动器

Gradle 运行时('org.springframework.boot:springbootstarteraop')

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <scope>runtime</scope>
</dependency>
示例代码已签入github:

样本输出:

MyReader : 0
MyProcessor : 0
MyWriter : [0]
MyReader : 1
MyProcessor : 1
MyWriter : [1]
MyReader : 2
MyProcessor : 2
MyWriter : [2]
MyReader : 3
****
MyReader : 3
****
MyReader : 3
****
MyReader : 3
MyProcessor : 3
MyWriter : [3]
MyReader : 4
MyProcessor : 4
MyWriter : [4]
MyReader : 5
当MyReader类抛出MyException时,它将停止作业的执行而不重试

重试策略未应用于项目读取器。因此,即使您将异常声明为可重试,并且该异常是从读取器抛出的,也不会调用重试策略


重试策略仅应用于处理器和写入程序。

@Mahmoud Ben Hassine我已在github中签入代码。如果我遗漏了什么,你能告诉我吗?“重试似乎在读卡器中起作用。@adesai是否提供了此帮助?我想使用容错重试,因为它提供了整个步骤的重试。”。马哈茂德·本·哈辛(Mahmoud Ben Hassine)关于重试不使用项读取器的说法是正确的。但是@Retryable正在使用项读取器(基于控制台输出),不是吗?请看一下:?“重试似乎对阅读器也有效。@马哈茂德·本·哈辛-谢谢你的回答,但你知道为什么该策略不适用于项目阅读器吗?”?这没有多大意义@在您共享的链接中,使用SpringRetry在读卡器本身中实现重试功能。这与您在应用于的容错步骤中指定的重试策略不同,容错步骤不调用读卡器。@adesai原因是项目读卡器的约定为“仅向前”,在重试时无法(在当前界面中)返回到以前的位置。在高级别上,面向块的步骤调用两个组件:
ChunkProvider
(通过调用项读取器提供块)和
ChunkProcessor
(通过调用processor+writer处理块)。在容错步骤中指定重试策略时,将使用重试策略配置
FaultTolerantChunkProcessor
(区块提供程序并非如此)。因此,重试策略应用于处理器和写入程序,但不应用于读取器。
@Override
@Retryable(include = { MyException.class }, maxAttempts = 5)
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
MyReader : 0
MyProcessor : 0
MyWriter : [0]
MyReader : 1
MyProcessor : 1
MyWriter : [1]
MyReader : 2
MyProcessor : 2
MyWriter : [2]
MyReader : 3
****
MyReader : 3
****
MyReader : 3
****
MyReader : 3
MyProcessor : 3
MyWriter : [3]
MyReader : 4
MyProcessor : 4
MyWriter : [4]
MyReader : 5