如何轮询BatchStatus以查找正在执行的作业?

时间:2019-06-21 12:19:19

标签: batch-processing jsr352 java-ee-8

我有一个批处理作业,必须重复执行才能列出项目。因此,我有一个“父级”作业,该作业使用批处理步骤加载列表并为列表中的每个ID启动一个子作业。 每个子作业都是使用 JobOperator 启动的,而param是使用 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);
            }
        }

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

3 个答案:

答案 0 :(得分:1)

要“轮询” JobExecution的状态,您应在每次检查JobOperator的状态时从其获取一个新实例。因此,将JobExecution 内部放入while循环,而不是外部。

因此它应该更像是:

do {
  Thread.sleep(300);

  // log or whatever

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

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

这有点棘手,因为此处的行为未由规范进行标准化。
由于该规范允许多种多样的作业存储库实现(例如数据库,简单的内存映射等),因此它不需要“缓存的” JobExecution的特定行为,并且您可能会发现它“有时会使用您的原始代码。

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

无论如何,要使您的代码更具可移植性,请在每次状态检查时获取JobExecution

答案 1 :(得分: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();

答案 2 :(得分: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);
    }
}