春季批处理在应用程序启动时停止 ItemReader 运行



我正在使用Spring Batch来运行从控制器方法触发的作业。一切正常,除了应用程序首次启动时,ItemReader运行并读取所有内容。

这是预期行为吗?这没什么大不了的,它只是将启动时间减慢了 500 秒。

注意:作业本身没有运行,因为我已通过以下方式禁用了它

batch:
job:
enabled: false

编辑:

配置

@Slf4j
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
@Value("${app.directoryPath}")
public String directoryPath;
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final LocationRepository locationRepository;
private final VideoRepository videoRepository;
public JobConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, LocationRepository locationRepository, VideoRepository videoRepository) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
this.locationRepository = locationRepository;
this.videoRepository = videoRepository;
}
@Bean(name = "importVideo")
public Job importVideo(Step processVideos) {
return jobBuilderFactory
.get("importVideo")
.start(processVideos)
.build();
}
@Bean(name = "processVideos")
public Step processVideos(VideoItemReader videoItemReader, VideoProcessor videoProcessor, VideoWriter videoWriter) {
return stepBuilderFactory.get("processVideos").<File, Video>chunk(25)
.reader(videoItemReader)
.processor(videoProcessor)
.writer(videoWriter)
.build();
}
@Bean
public VideoWriter videoWriter() {
return new VideoWriter(videoRepository);
}
@Bean
public VideoProcessor videoProcessor() {
return new VideoProcessor(locationRepository);
}
@Bean
public VideoItemReader videoItemReader() {
return new VideoItemReader("file:" + directoryPath, locationRepository);
}
}

我正在通过以下方式GET请求调用工作

@GetMapping("/jobs/{job}")
public ResponseEntity<String> importVideos(@PathVariable String job) {
if (job.equalsIgnoreCase("createThumbnails")) {
executeJob(createThumbnails);
} else if (job.equalsIgnoreCase("importVideo")) {
executeJob(importVideo);
}
return new ResponseEntity<>("running", HttpStatus.OK);
}
private void executeJob(Job job) {
Set<JobExecution> runningJobExecutions = jobExplorer.findRunningJobExecutions(job.getName());
if (runningJobExecutions.isEmpty()) {
try {
jobLauncher.run(job, new JobParameters());
} catch (Exception ex) {
log.error(ex.getMessage());
}
} else {
log.info("executeJob already running, so... NOPE!");
}
}

但是我如何调用它与它无关,如果我删除该代码,则相同的行为仍然存在......

这主要是由于 spring 无法识别 spring.batch.job.enabled 属性,请尝试将其添加到您的

在应用程序类中显式加载属性,希望这将解决问题。

@PropertySource("classpath:batch.properties")

解决了我的问题,问题是我的自定义阅读器实现也在实现InitializingBean它有效地调用了"getVideos(("。

删除InitializingBean接口会停止读取器在每次引导时运行。

最新更新