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

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

2 years ago

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

JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);

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

jobCompletionReader.getLastCompleteDate()

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