2

我使用 H2 数据库作为作业存储库。应用程序重新启动后,我需要继续或重新启动以前未完成的 Spring Batch Jobs。

现在我使用以下代码来实现这一点:

    jobRegistry.register(new ReferenceJobFactory(documetPipelineJob));

    List<String> jobs = jobExplorer.getJobNames();
    for (String job : jobs) {
    Set<JobExecution> runningJobs = jobExplorer.findRunningJobExecutions(job);

    for (JobExecution runningJob : runningJobs) {
        runningJob.setStatus(BatchStatus.FAILED);
        runningJob.setEndTime(new Date());
        jobRepository.update(runningJob);
        jobOperator.restart(runningJob.getId());
        LOGGER.info("Job restarted: " + runningJob);
    }

它工作正常但有一个副作用 - 它在BATCH_JOB_EXECUTION 表中生成新记录并为其分配新executionId值。但我使用executionIdvalue 来跟踪工作状态:

jobExplorer.getJobExecution(executionId).getStatus()

因此,我使用以下逻辑 - 我安排作业并返回executionId. 后来,我使用它executionId来跟踪我的工作状态。使用上面提到的重新启动逻辑 - 我返回executionId, 然后重新启动应用程序,在应用程序启动后,我的逻辑重新启动未完成的作业并为它们分配新的executionId. 因此,在这种情况下,我无法跟踪新的重新启动作业的状态,因为我只有旧的executionId

在这种情况下如何正确检查作业状态或如何正确重新启动作业以便能够跟踪旧作业的状态executionId

4

0 回答 0