我使用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
只有当工作没有成功完成时才会发生这种情况。有关解决方案的任何想法吗?
答案 0 :(得分:0)
JobInstance
只能在成功完成一次后才能完成。当您通过Spring Boot启动Spring Batch作业时,如果有JobParameter
提供(如您所示),Spring Batch会处理递增JobParametersIncrementer
的逻辑。但是......当Spring Batch执行递增时,它只会在上一个作业成功时递增。在您的情况下,您希望它始终递增。因此,您需要编写自己的CommandLineRunner
,并始终增加JobParameters
。
Spring Boot' JobLauncherCommandLineRunner
是启动作业的代码所在。您可能希望对其进行扩展并覆盖它的execute
方法,以确保作业参数始终递增。