首页 > 解决方案 > 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!");
    }
}

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

标签: springspring-batch

解决方案


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

在您的 Application 类中显式加载您的属性,希望这可以解决问题。

@PropertySource("classpath:batch.properties")

推荐阅读