我已经写了一个spring-batch作业,我每10分钟使用调度程序执行一次。现在,这项工作的主要任务是将数据从一个数据库传输到另一个数据库。

我面临的问题是,有时可能会有大量数据,可能需要10分钟以上的作业执行时间。在这种情况下,我想检测是否有任何作业正在运行?如果不是,那么我将重新运行一个新的作业实例。如果该作业已经在运行,那么我将跳过“新作业实例调用”。我写了一些如下的代码。

Job job = (Job) context.getBean("job");

JobExplorer explorer = (JobExplorer) context.getBean("jobExplorer");

// Fetching all job instances.
List<JobInstance> jobInstances = explorer.findJobInstancesByJobName(
        job.getName(), 0, explorer.getJobInstanceCount(job.getName()));

// Fetching the last job instance.
JobInstance lastJobInstance = jobInstances.get(0);

//Obtain all executions for last job instance.
List<JobExecution> executions = explorer.getJobExecutions(lastJobInstance);

// fetching last job execution
JobExecution lastJobExecution = executions.get(0);

System.out.println("Is my last Job running? \nAns:"+lastJobExecution.isRunning());


几件事,此代码是检查以前所有正在运行的作业。我所假设的是,如果我启动服务器,那么在服务器启动之前不会再运行其他作业;如果我在检查先前的作业运行之后是否运行了作业,那么我将认为在调度程序代码中不会再调用其他作业。

我想知道这是正确的方法吗?我的意思是确保同一时间只为同一作业运行一个作业实例,并且在同一作业的所有先前运行完成之后也是如此。

P.S作业实例以及jObExplorer和jobLauncher被注入调度程序中。这只是一个类似的代码,因此可以使用上下文获取bean。

感谢您的阅读。

最佳答案

如果您使用的是调度程序,则可能应该有一个JobLauncherDetails类,可以在其中添加诸如

JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);


这些参数之一可能是您的最后一次运行时间,
向该地图添加一个dateTime参数,并使用JobCompletionReader的实例

jobCompletionReader.getLastCompleteDate()


将其与10分钟前进行比较,看看您是否已完成“ 10分钟前的工作”。
这样的东西应该适合您。

09-11 18:42
查看更多