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