繁体   English   中英

春季批处理使用JobParameters重新启动

[英]Spring batch restart with jobparameters

是否可以针对Spring批处理中的特定参数重新启动作业?

我在元表中有两个失败的工作实例。 每个作业都有其自己的作业参数。 现在,我想使用给定的参数重新启动作业。 即使我传递了job参数,它始终仅重新启动最后一次失败的执行。

我的工作:

<batch:job id="JobA"  incrementer="runIdIncrementer">
    <batch:step id="abcde">
        <batch:tasklet transaction-manager="transactionManager">
            <batch:chunk reader="Reader" writer="Writer" processor="Processor" commit-interval="100" />
        </batch:tasklet>
    </batch:step>
</batch:job>

我将在两个不同的实例中使用不同的参数启动JobA。 假设假设JobA为1234帐户,而JobA为5678帐户。 两个实例均失败。 现在,我要为1234帐户重新启动JobA。 但是,无论参数如何,Spring Batch始终会重新启动上次失败的故障排除。

编辑调试CommandLineJobRunner我发现以下代码始终会重新启动最新的失败作业,而与作业参数无关:

private JobExecution getLastFailedJobExecution(String jobIdentifier) {
    List<JobExecution> jobExecutions = getJobExecutionsWithStatusGreaterThan(jobIdentifier, BatchStatus.STOPPING);
    if (jobExecutions.isEmpty()) {
        return null;
    }
    return jobExecutions.get(0);
}

我们遇到了同样的问题,对我来说,这似乎是一个缺陷,尤其是当您比较SimpleJobLauncher如何评估上一份工作时。

如您所述,getLasFailedJobExecution()不考虑参数。 (至少在我看来,这是错误的。您可以使用不同的标识参数运行相同的作业,但是仅当其中一次运行失败时才重新启动。)

另一方面,SimpleJobLauncher根据参数获取最后的作业执行:

public JobExecution run(final Job job, final JobParameters jobParameters)
        throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException,
        JobParametersInvalidException {
...

    JobExecution lastExecution = jobRepository.getLastJobExecution(job.getName(), jobParameters);
...

这是不一致的。

我们解决该问题的方法是实现从CommandLineJobRunner派生的自己的CommandLineJobRunner,但是您必须覆盖整个start方法,因此,您还必须复制几个私有方法。

必须以如下方式更改start方法中的整个重新启动部分:

        if (opts.contains("-restart")) {
            JobExecution lastExecution = jobRepository.getLastJobExecution(job.getName(), jobParameters);

            if (!jobExecution.getStatus().isGreaterThan(BatchStatus.STOPPING)) {
                throw new JobExecutionNotFailedException("No failed or stopped execution found for job="
                        + jobIdentifier);
            }
            jobParameters = jobExecution.getJobParameters();
            jobName = jobExecution.getJobInstance().getJobName();
        }

已编辑

有时候我真的应该阅读javadoc ...

如果重新启动,则可以传递执行ID而不是作业名。 在这种情况下,它将找到正确的执行重新启动。

从javadoch的main方法:

重新启动:(可选)如果作业已失败或停止,并且大多数应重新启动。 如果指定,则jobIdentifier参数可以解释为作业的名称失败的作业执行的ID

因此,在重新启动的情况下使用执行ID将确保正确的实例重新启动。 在这种情况下,您也不必提供任何其他参数,因为它们将从上次执行中获取。

如果您第二次将相同的参数集传递给CommandLineJobRunner-作业将在失败时重新启动。

选项“ -restart”是提供的另一种快捷方式,用于重新启动某些类型的运行(例如,上次失败的运行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM