1

我有一个必须为项目列表重复的批处理作业。所以我有一个“父”作业,它使用批处理步骤来加载列表并为列表中的每个 id 启动一个子作业。每个子作业都是使用JobOperator和使用Properties类的参数启动的,这可以按预期工作。

我必须检索批处理状态并等待子作业完成,以便遍历列表。我正在尝试使用JobExecution类获取批处理状态或退出状态,但是JobExecution没有检索子作业的批处理状态。

相反,我总是看到 的批处理状态STARTED,即使在子作业完成后也是如此。

我的代码如下所示:

for (int i = 1; i <= rsList; i++) {
            long execId = jobOperator.start("gah-history-chunk-archive-job",jobParamProperties);
            JobInstance jobInstance = jobOperator.getJobInstance(execId);
            JobExecution jobExecution = jobOperator.getJobExecution(execId);
            logger.info("Instance id: "+jobInstance.getInstanceId());
            while(!jobExecution.getBatchStatus().toString().equals("COMPLETED") || !jobExecution.getBatchStatus().toString().equals("FAILED")) {
                //Both batch status and exit status giving the status of this batchlet, not giving the status of gah-history-chunk-archive-job
logger.info("Batch status is: "+jobExecution.getBatchStatus() +" Thread is sleeping for 5 seconds");
                logger.info("Exit status:"+jobExecution.getExitStatus());

                Thread.sleep(300);
            }
        }

我想知道,如何检索从批处理启动的子作业的批处理或退出状态。为什么我继续看到 BatchStatus STARTED

4

3 回答 3

1

要“轮询” a 的状态,JobExecution您应该在每次检查其状态时从 JobOperator 获取一个新实例。所以让 JobExecutionwhile 循环内,而不是在外面。

所以它应该更像,例如:

do {
  Thread.sleep(300);

  // log or whatever

  BatchStatus status = jobOperator.getJobExecution(execId).getBatchStatus();

}  while(status != BatchStatus.COMPLETED && status != BatchStatus.FAILED) ;

这有点棘手,因为这里的行为没有被规范标准化。
因为规范允许多种作业存储库实现(例如数据库、简单的内存映射、其他……),它不需要“缓存”作业执行的特定行为,您可能会发现它“有时可以使用您的原始代码。

我不认为您实际看到的是返回的“父”对象实例;我怀疑你可能只是因为没有看到你所期望的而感到困惑。

在任何情况下,为了让您的代码更具可移植性,请在JobExecution每次状态检查时获取 。

于 2019-06-24T02:29:30.773 回答
0

JobExecution 指向父作业,即使它是使用子作业执行 ID 设置的。不知道为什么批处理会以这种方式运行。

JobExecution jobExecution = jobOperator.getJobExecution(execId);
jobExecution.getBatchStatus(); //Parent job status

但是如果我们使用 BatchRuntime 类,我们可以得到相应的作业,批处理状态。这有助于我获取子作业状态,并可以循环到下一次批量启动。

//Returns the child job status as expected
BatchRuntime.getJobOperator().getJobExecution(execId).getBatchStatus();

于 2019-06-21T17:08:08.797 回答
0

我建议轮询作业的Exitstatus而不是 BatchStatus 本身:

for (int i = 1; i <= rsList; i++) {
    long execId = jobOperator.start("gah-history-chunk-archive-job",jobParamProperties);
    JobInstance jobInstance = jobOperator.getJobInstance(execId);
    JobExecution jobExecution = jobOperator.getJobExecution(execId);
    logger.info("Instance id: "+jobInstance.getInstanceId());
    while(jobExecution.getExitStatus() == null) {
        //do your logging etc.   
        Thread.sleep(300);
    }
}
于 2019-06-26T07:06:49.113 回答