【问题标题】:How to make my Spring Batch step executions end with statuses other than COMPLETED如何使我的 Spring Batch 步骤执行以 COMPLETED 以外的状态结束
【发布时间】:2013-11-03 14:46:42
【问题描述】:

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

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

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

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

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

在该表中,如果步骤成功,我希望步骤以 STOPPED 结束,而不是以 COMPLETED 结束。有任何想法吗?有没有可能一开始就做到这一点?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    设置步骤执行状态 -

    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">
    

    【讨论】:

    • 非常感谢,这似乎有道理。我将尝试这种方法并将结果提供给可能感兴趣的其他人。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢贝拉巴克斯。看来我别无选择,只能拥有多个工作实例。您是否知道定期清理基础设施表的任何方法?我们的批次将每天运行 8 次,因此随着时间的推移,这些表对我们来说可能会变得非常大。
    • 一个用石英安排的工作:)
    【解决方案3】:

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

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

    @Test
    public void importFilesTest() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
        jobLauncher.run(job, new JobParametersBuilder()
                .addLong("timestamp",
                        System.currentTimeMillis())
                .toJobParameters());
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多