У меня есть Spring загрузки Batch приложения:Как График Spring загрузки Batch Application
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LoadApplication {
public static void main(String[] args) {
SpringApplication.run(LoadApplication.class, args);
}
}
В в @Configuration
классе также с аннотацией @EnableBatchProcessing
, я следующая пакетное задание боб определено:
@Bean
public Job loadJob(JobBuilderFactory jobs, Step stepLoadFile, Step stepArchiveFile) {
return jobs.get("loadJob")
.incrementer(new RunIdIncrementer())
.start(stepLoadFile)
.next(stepArchiveFile)
.build();
}
Загрузочный файл stepLoadFile
читает плоский файл (см. Ниже) и записывает данные файла в базу данных. stepArchiveFile
затем перемещает файл в другой каталог.
Обычно задание должно выполняться один раз в день (вторник - суббота) в указанное время. Однако, если плоский файл не найден, задание не работает, и его необходимо перезапустить каждые 30 минут, пока он не завершится, или не будет достигнут максимальное количество попыток (например, 5). После успешного повторного запуска задание не должно запускаться снова до следующего нормального времени работы. Кроме того, система должна в идеале предотвращать параллельные прогоны одной и той же работы. Как все это можно сделать?
Примечание: повторное воспроизведение не требуется, чтобы выполнить сбой предыдущей работы. Это связано с тем, что размер блока больше, чем количество элементов в файле.
Я попробовал это в моем @Configuration
классе (Примечание: Я также добавил @EnableRetry
конфигурации и основной класс):
@Bean
public ItemReader<Test> reader(LineMapper<Test> lineMapper, ApplicationProperties properties) {
FlatFileItemReader<Test> flatFileItemReader = new FlatFileItemReader<Test>() {
@Override
@Retryable(value = {ItemStreamException.class}, maxAttempts=5)
public void open(ExecutionContext executionContext) throws ItemStreamException {
super.open(executionContext);
}
@Override
@Retryable(maxAttempts=5)
public Holding read() throws UnexpectedInputException, ParseException, Exception {
return super.read();
}
};
flatFileItemReader.setResource(new FileSystemResource(properties.getLoadFile()));
flatFileItemReader.setLineMapper(lineMapper);
return flatFileItemReader;
}
ItemStreamException
брошено и выход из приложения без повтором.
Спасибо за ответ. К сожалению, однако, я не думаю, что это полностью выполняет то, что мне нужно. Работа должна выполняться обычно один раз в день. В '@ Scheduled', вы запускаете его каждые 30 минут. Когда происходит сбой задания, мне нужно его повторять каждые 30 минут, пока он не удастся. С 'retry-limit', я думаю, что он будет немедленно повторять попытку, а не ждать 30 минут. Я также считаю, что 'retry-limit' находится на уровне позиции, а не на уровне работы. Пожалуйста, поправьте меня, если я ошибаюсь в любом из этих пунктов. – James