【发布时间】:2019-12-19 23:04:54
【问题描述】:
我在我们的云平台上运行了一个 Spring Batch 任务,它将使用提供的命令行参数启动,然后跳过第一个步骤的执行,并出现以下错误:
[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();
}
有人知道导致这种行为的原因吗?
【问题讨论】:
-
同一个作业实例可能有多个作业执行,例如当第一次执行失败并且您尝试再次重新运行作业时。如果您使用相同的标识参数启动作业,您将尝试(重新)运行相同的作业实例:如果最后一个作业执行失败,您将执行新的作业,否则 Spring Batch 将告诉您作业实例已完成并且无法再次运行 (
JobInstanceAlreadyCompleteException)。但在您的情况下,您正在设置一个RunIdIncrementer,因此您每次都应该获得一个新的作业实例。您如何开展工作?
标签: mysql spring spring-batch cloud-foundry spring-cloud-dataflow