Я пытаюсь предоставить 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
. Сейчас я пытаюсь понять, как преодолеть это