1

要求:
经理不希望作业实例和作业执行表中有多个作业实例。尽管多次处决没问题,但他只想要一个实例。

含义:作业不能以 COMPLETED 批处理状态结束,因为这样的实例永远无法重新启动。

我的方法:我尝试以 STOPPED 批处理状态结束作业,以便下一次运行作业运行与之前运行的相同实例。(请注意,如果作业失败,则没有问题,因为可以重新运行失败的实例)。我计划对作业没有参数,以便每次运行时创建的默认实例与数据库中已经存在的实例(作业实例表)相匹配。这样,我不必担心在重新启动时将任何参数传递给作业,因为只有一个实例并且它没有区分参数。

问题:如果所有步骤都完成并且所有这些步骤的 BATCH_STEP_EXECUTION 更新为 COMPLTED,即使我设法让作业执行以 STOPPED 状态结束,我也无法再重新运行同一个作业实例。我收到消息:所有步骤都已完成或没有为此作业配置步骤。

我知道该消息的含义,但我试图让所有步骤都以完成以外的状态结束,以便每当我重新运行我的单个实例时,这些步骤也可以重新运行,而不是收到上述消息。我知道可以使用步骤执行状态来导出作业执行状态。例如,如果一个步骤以 STOPPED 结束,您可以使用该状态来指示作业以 STOPPED 以及通过 、 或 元素结束。这不是我想要的,因为我已经知道如何使用它们,除非有办法做到这一点,这样它们会影响 BATCH_STEP_EXECUTION 表中更新的内容。

在该表中,如果步骤成功而不是 COMPLETED,我希望步骤以 STOPPED 结束。有任何想法吗?是否有可能首先实现这一目标?

4

4 回答 4

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">
于 2013-10-25T04:20:24.550 回答
2

必须完成作业(作为步骤)才能让 spring-batch 正确管理作业的生命周期。

允许多次运行同一个作业的方法是使用一个额外的作业参数来使每个作业都与其他作业不同;您可以使用 aJobParametersIncrementer或仅添加一个新参数,例如startDate = new Date().
IMO 应避免使用您的方式。

于 2013-10-25T08:49:06.723 回答
1

当获得“所有步骤已完成或没有为此作业配置步骤”时。可能是您正在使用完全相同的参数运行相同的作业。

为了轻松解决这个问题,您可以像这样向 JobParams 添加一个时间戳:

@Test
public void importFilesTest() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
    jobLauncher.run(job, new JobParametersBuilder()
            .addLong("timestamp",
                    System.currentTimeMillis())
            .toJobParameters());
}
于 2015-08-14T17:31:02.380 回答
0

我遇到过同样的问题。我想在失败时重新开始工作。我使用决策者在批处理作业配置文件中进行流程决策。

当我故意使作业失败/停止并使用更正的数据重新运行时,作业直接跳转到决策程序,而无需重新运行我想在失败时重新运行的步骤。我对其进行了研究并得出结论,即使作业失败/停止,您也无法使用相同的作业参数重新运行该步骤。由于在 Batch Job 表中,Step 的状态为 COMPLETED。因此,根据春季批处理生命周期,作业将从失败的点开始。就我而言,这一点是决定性的。因此,作业从决策者运行以正确管理批处理作业生命周期。希望这对你有帮助。

于 2016-09-08T08:41:26.180 回答