如何找到以前正在运行的作业/任务中的任何一个未在春季批处理中运行?我试过一些代码,但不确定

时间:2015-03-07 16:18:08

标签: java spring spring-batch spring-batch-admin

我写了一个弹簧批处理作业,我每隔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。

感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

如果您正在使用调度程序,那么您可能应该有一个JobLauncherDetails类,您可以在其中添加

之类的参数
JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);

其中一个参数可能是你的最后一次运行时间, 将dateTime参数添加到此映射并使用JobCompletionReader的实例

jobCompletionReader.getLastCompleteDate()

比较之前10分钟,看看你是否完成了“10分钟前的工作”。 这样的事情对你有用。