4

我正在将 Spring Batch 与 Spring 云任务一起使用。我的工作中有以下配置:

@Bean
    public Job jobDemo(
            @Value("${jobname}")String jobName,
            JobBuilderFactory jobBuilderFactory,
            JobCompletionNotificationListener listener
        ) {
        return jobBuilderFactory.get(jobName)
                .incrementer(new RunIdIncrementer())
                .preventRestart()
                .listener(listener)
                .flow(stepA())
                .end()
                .build();
    }

我不想在工作中重新启动功能,这就是我放.preventRestart(). 我想在每次任务运行时启动一个新作业,也就是说,即使上次作业失败或停止或任何其他情况,也要运行一个新的作业实例。但我收到以下错误:

org.springframework.batch.core.repository.JobRestartException: JobInstance already exists and is not restartable

这仅在作业未成功完成的情况下发生。关于解决方案的任何想法?

4

1 回答 1

2

AJobInstance只能成功完成一次。当您通过 Spring Boot 启动 Spring Batch 作业时,Spring Batch 处理逻辑以增加 aJobParameter如果有JobParametersIncrementer提供(正如您所拥有的)。但是......当 Spring Batch 进行递增时,它只会在前一个作业成功的情况下递增。在您的情况下,您希望它始终递增。因此,您将需要编写自己的CommandLineRunner始终递增JobParameters.

Spring BootJobLauncherCommandLineRunner是启动作业的代码所在的位置。您可能希望扩展它并覆盖它的execute方法,以确保作业参数始终递增。

于 2018-03-15T17:21:10.237 回答