要求:
Manager不希望作业实例和作业执行表中有多个作业实例。虽然多次执行都很好,但他只想要一个实例。
意义: 作业不能以批处理状态COMPLETED结束,因为这样的实例永远不能重新启动。
我的方法: 我尝试以批处理状态STOPPED结束作业,以便下一次运行该作业运行先前运行的同一实例。 (请注意,如果作业失败,则没有问题,因为可以重新运行失败的实例)。我计划没有该作业的参数,以便在每次运行时创建的默认实例与数据库中已存在的实例(作业实例表)匹配。通过这种方式,我不必担心在重新启动时将任何参数传递给作业,因为只有一个实例并且它没有区分参数。
问题: 如果所有步骤都完成且BATCH_STEP_EXECUTION针对所有此类步骤更新为COMPLTED,则即使我设置作业执行结束状态为STOPPED,也无法再重新运行此相同的作业实例。我收到消息:已完成所有步骤或未为此作业配置步骤。
我知道这条消息的含义但是我试图让所有步骤都以完成后的状态结束,以便每当我重新运行我的单个实例时,这些步骤也可以重新运行,而不是在上面执行信息。 我知道可以使用步骤执行状态来导出作业执行状态。例如,如果步骤以STOPPED结束,则可以使用该状态来指示作业也通过,或元素结束在STOPPED中。这不是我想要的,因为我已经知道如何使用它们,除非有办法这样做,它们会影响BATCH_STEP_EXECUTION表中更新的内容。
在该表中,如果成功而不是使用COMPLETED,我希望步骤以STOPPED结束。有任何想法吗?是否有可能首先实现这一目标?
答案 0 :(得分:4)
设置步骤执行状态 -
StepExecution stepExecution = StepSynchronizationManager.getContext().getStepExecution();
stepExecution.setExitStatus("XYZ")
步骤
中'结束'的示例<batch:step id="step1">
<batch:tasklet ref="aaaTasklet"/>
<batch:end on="END1" />
<batch:end on="XYZ"/>
<batch:next on="*" to="step2" />
<batch:listeners>
<batch:listener ref="aaaTaskletListener" />
</batch:listeners>
</batch:step>
<batch:step id="step2">
.
.
.
</batch:step>
批处理架构 - http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 搜索
<xsd:element name="end">
答案 1 :(得分:2)
必须完成作业(作为步骤)才能让spring-batch正确管理作业的生命周期。
允许多次运行相同作业的方法是使用额外的作业参数来使每个作业与其他作业不同;您可以使用JobParametersIncrementer
或只添加startDate = new Date()
等新参数
IMO应该避免使用。
答案 2 :(得分:0)
获取&#34;所有步骤已完成或未为此作业配置步骤。&#34;可能是你使用完全相同的参数运行相同的工作。
要轻松解决这个问题,您只需向JobParams添加时间戳,如下所示:
@Test
public void importFilesTest() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
jobLauncher.run(job, new JobParametersBuilder()
.addLong("timestamp",
System.currentTimeMillis())
.toJobParameters());
}
答案 3 :(得分:0)
我有同样的问题。我想在失败时重新开始工作。我使用decider在批处理作业配置文件中进行流程决策。
当我故意失败/停止作业并重新运行更正的数据时 - 作业直接跳转到决策程序而不重新运行我想要在发生故障时重新运行的步骤。我对它做了研究并得出结论,你不能用相同的工作参数重新运行步骤,即使工作失败/停止。由于在批处理作业表中,步骤的状态为COMPLETED。因此,根据弹簧批生命周期,Job将从失败的点开始。就我而言,那一点是决策者。因此,作业从决策者运行到正确管理批处理作业生命周期。 希望这对你有所帮助。