Повторите попытку не работать с Spring Batch с Java Config - PullRequest
0 голосов
/ 16 мая 2019

У меня есть пакетное задание 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();
}

Когда класс MyReader выдает MyException, он останавливает выполнение задания без повторной попытки со следующей трассировкой стека:

2019-05-16 14:45:09.460 ERROR 22485 --- [           main] o.s.batch.core.step.AbstractStep         : Encountered an error executing step step1 in job myJob

org.springframework.batch.core.step.skip.NonSkippableReadException: Non-skippable exception during read
    at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:105) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:116) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Когда класс MyReader генерирует исключение MyException, он останавливает выполнение задания без повторной попытки

Политика повторных попыток не применяется к устройству чтения элементов.Таким образом, даже если вы объявляете исключение как повторяемое и это исключение выдается из считывателя, политика повторных попыток не вызывается.

Политика повторных попыток применяется только к процессору и устройству записи.

0 голосов
/ 16 мая 2019

Кажется, что функция повтора была извлечена из Spring Batch с 2.2.0.Теперь это часть новой библиотеки Spring Retry.https://docs -stage.spring.io / spring-batch / docs / current / reference / html / retry.html # retry

Шаги для решения этой проблемы с декларативной повторной попыткой:

Шаг 1: Включить @EnableRetry в приложение

Spet 2: Добавить aop стартер на основе https://github.com/spring-projects/spring-retry#additional-dependencies

Gradle runtime ('org.springframework.boot: spring-boot-starter-aop')

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <scope>runtime</scope>
</dependency>

Spet 3: Включить @Retryable в MyReader

@Override
@Retryable(include = { MyException.class }, maxAttempts = 5)
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

Пример кода проверен в github: https://github.com/atulkulkarni18/spring-batch-reader-retry

Пример вывода:

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
...