spring - Spring批处理停止在应用程序启动时运行的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 属性,请尝试将其添加到您的
在您的 Application 类中显式加载您的属性,希望这可以解决问题。
@PropertySource("classpath:batch.properties")
推荐阅读
- attachment - 无法删除某人已打开的列表附件
- javascript - 轮播导致屏幕在幻灯片更改时移动到页面顶部
- asp.net - ASP.NET ActionFilter 的生命周期
- python - 端点从 Pytest 返回 404
- c# - 统一 - Input.GetMouseButtonDown
- database - 如何阻止 Git 覆盖我的数据库连接文件?
- python - 如何在 Outlook 中释放 COM 对象的内存,在处理数千封电子邮件时内存不足?
- node.js - React: 使用 firebase 功能、节点 multer 进行 Multer 图像和数据上传
- performance - 减少内存分配并提高 Julia 代码的速度
- flutter - Flutter - 调用 Navigator.pop() 后布尔值不断重置