Spring Batch - как запустить задание с именем файла, полученным из запроса API остальных - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь предоставить API отдыха и использовать его для получения параметра имени файла и запуска с ним задания Spring Batch.

Я хочу, чтобы каждый запрос запускал задание, и чтобы мой ItemReader искал это имя файла.

Я читал некоторые другие вопросы, касающиеся того, как запустить задание через Rest API, и как ItemReader может получить доступ к jobParameters, но не смог найти способ получить параметры из запроса API. Ниже мой код:

@Configuration
public class BatchConfig {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    private static final String WILL_BE_INJECTED = null;

    @Bean
    public Job processJob() {
        return jobBuilderFactory.get("myJobName")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<Foo, Foo> chunk(1)
                .reader(excelReader(WILL_BE_INJECTED))
                .processor(new Processor()).faultTolerant().skipPolicy(skip())
                .writer(new Writer())
                .build();
    }

    @Bean
    @StepScope
    ItemReader<Foo> excelReader(@Value("#{jobParameters['fileName']}") String fileName) {
        PoiItemReader<Foo> reader = new PoiItemReader<>();
        reader.setLinesToSkip(3);
        reader.setResource(new ClassPathResource("data/" + fileName));
        reader.setRowMapper(excelRowMapper());
        return reader;
    }

    private RowMapper<Foo> excelRowMapper() {
        return new FooExcelRowMapper();
    }

    @Bean
    public SkipPolicy skip() {
        return new SkipPolicies();
    }

}

И мой контроллер:

@RestController
public class BatchResource {

    private final JobLauncher jobLauncher;

    private final Job job;

    public BatchResource(JobLauncher jobLauncher, Job job) {
        this.jobLauncher = jobLauncher;
        this.job = job;
    }

    @PostMapping
    public void launchJob(@RequestParam(value = "file_name", required = true) final String fileName) throws Exception {
        final JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addString("fileName", fileName);

        final JobParameters jobParameters = jobParametersBuilder.toJobParameters();

        jobLauncher.run(job, jobParameters);
    }
}

К сожалению, не похоже, что ItemReader понимает имя файла для чтения. Задание выполняется "успешно", но фактически не читает мой входной файл.

Редактировать: я начал новый проект с тем же намерением и заметил, что, как только я использую аннотацию @StepScope, он перестает работать и больше не работает, даже если я удаляю аннотацию @StepScope. Сейчас я пытаюсь понять, как преодолеть это

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

После некоторой отладки я заметил реализацию ItemReader, которую я использую для чтения файлов Excel (https://github.com/spring-projects/spring-batch-extensions/tree/master/spring-batch-excel) не смог прочитать файл Excel, как только я начал использовать аннотацию @StepScope.

Итак, я нашел этот вопрос PoiItemReader с аннотацией StepScope не читает файл Excel , на который ответил Niraj Sonawane.

В основном мне пришлось изменить тип возвращаемого значения с ItemReader<Foo> на PoiItemReader<Foo> ниже:

@Bean
@StepScope
PoiItemReader<Foo> excelReader(@Value("#{jobParameters['fileName']}") String fileName) {
    PoiItemReader<Foo> reader = new PoiItemReader<>();
    reader.setLinesToSkip(3);
    reader.setResource(new ClassPathResource("data/" + fileName));
    reader.setRowMapper(excelRowMapper());
    return reader;
}
0 голосов
/ 13 июня 2019

На самом деле у меня точно такой же способ динамической передачи пути вместо имени файла к заданию:

reader.setResource(new PathResource(path));

Так все работает нормально. Может быть, попробуйте это.

+ помните, что ресурсы Classpath должны находиться внутри банки. Где находится ваш файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...