我在云平台上运行了一个Spring批处理任务,它将使用提供的命令行参数启动,然后跳过第一步的执行,并出现以下错误:
[OUT] The job execution id 992 was run within the task execution 1325
[OUT] Step already complete or not restartable, so no action to execute:
StepExecution: id=1071, version=3, name=OFileStep, status=COMPLETED, exitStatus=COMPLETED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0,
writeSkipCount=0, processSkipCount=0, commitCount=1, rollbackCount=0, exitDescription=
我已经调查了Spring Batch使用的MySQL示例中的元数据表,发现JOB_INSTANCE_ID在多次执行之间是相同的,而它每次都应该递增1。
我为作业配置定义的@Bean是:
@Bean
public Job job() {
return jobBuilderFactory.get(OTaskConstants.JOB_NAME)
.listener(listener())
.incrementer(new RunIdIncrementer())
.start(dataTransferTaskStep())
.next(controlMTaskStep())
.build();
}
有人知道是什么导致了这种行为吗?
4条答案
按热度按时间s5a0g9ez1#
下面这条线清楚地说明了一切。
这意味着步骤/作业已经完成,无法重新启动。这是Spring Batch的行为。为了绕过此问题,我们需要传递一个唯一的参数。
在你的情况下,我看到你已经有RunIdIncrementer。现在的问题是为什么它不工作。
您是否可以查看BATCH_JOB_PARMS表以了解哪些参数传递给了作业?您可能遗漏了某些内容。
您也可以使用SimpleIncrementor。请参阅下面的代码以了解说明。
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#JobParametersIncrementer
vmjh9lq92#
删除作业上的@Bean注解。
它会导致在每次启动/启动应用程序时,在没有参数的情况下启动作业,因为spring会尝试加载bean,然后启动批处理作业。
删除注解并使用spring scheduler来调度作业。
kknvjkwl3#
我遇到了同样的问题。下面的代码帮助我解决了这个问题。通过在作业启动器中添加参数,每次运行都会创建一个新的job_instance_id。
djp7away4#
请参阅上面的错误消息“如果要再次运行此作业,请更改参数。”公式为JobInstance = JobParameters + Job。如果没有任何JobParameters参数,只需将当前时间作为参数传递以创建新的JobInstance。例如,
来源:https://mkyong.com/spring-batch/spring-batch-a-job-instance-already-exists-and-is-complete-for-parameters/