java - 如何查找以前运行的作业/任务未在 Spring Batch 中运行?我尝试了一些代码但不确定

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

我编写了一个 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());

有几件事,这段代码是检查之前所有正在运行的作业。我假设的是,如果我启动服务器,那么在服务器启动之前不会运行其他作业,如果我在检查上一个作业是否运行后运行作业,我假设我的调度程序代码中不会调用其他作业。

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

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

感谢您的阅读。

最佳答案

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

JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);

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

jobCompletionReader.getLastCompleteDate()

与10分钟前比较,看看你是否完成了“10分钟前的工作”。 类似的东西应该适合你。

关于java - 如何查找以前运行的作业/任务未在 Spring Batch 中运行?我尝试了一些代码但不确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28916980/

相关文章:

java - 在我的 Java Servlet 中使用私有(private)类有什么问题吗?

java - Java 中 int 转换为 enum

java - 如何高效处理Spring中的错误: Could not resolve view with name 'forward:/oauth/error'

java - 使用mockito初始化spring batch jobExecution

spring - H2 SQL语法异常

java - JTable 和 DefaultTableModel

java - 如何从 JRuby 获取 Java 接口(interface)的类型正确的 ruby​​ 实现?

java - @RepositoryRestResource 在 Spring Boot 2.2.1.RELEASE 中不起作用。运行时出现错误 RegionRepository 必须只包含一个路径段

java - Spring MVC 获取不是服务器上对象属性的元素的值

spring - 将动态资源注入(inject) Spring Batch ItemReader