Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何查找以前运行的任何作业/任务未在spring批处理中运行?我试过一些代码,但不确定_Java_Spring_Spring Batch_Spring Batch Admin - Fatal编程技术网

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

Java 如何查找以前运行的任何作业/任务未在spring批处理中运行?我试过一些代码,但不确定,java,spring,spring-batch,spring-batch-admin,Java,Spring,Spring Batch,Spring Batch Admin,我编写了一个spring批处理作业,每10分钟使用调度程序执行一次。现在这个任务主要是将数据从一个数据库传输到另一个数据库 我面临的问题是,有时可能会有大量数据,这可能需要作业执行超过10分钟。在这种情况下,我想检测是否有任何作业已在运行?如果不是,那么我将重新运行一个新的作业实例。如果该作业已经在运行,那么我将跳过“新作业实例调用”。我写了一些代码,如下所示 Job job = (Job) context.getBean("job"); JobExplorer explorer = (Job

我编写了一个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());
Job Job=(Job)context.getBean(“Job”);
JobExplorer=(JobExplorer)context.getBean(“JobExplorer”);
//正在获取所有作业实例。
List jobInstances=explorer.findJobInstancesByJobName(
job.getName(),0,explorer.getJobInstanceCount(job.getName());
//正在获取最后一个作业实例。
JobInstance lastJobInstance=jobInstances.get(0);
//获取上一个作业实例的所有执行。
列表执行=explorer.getJobExecutions(lastJobInstance);
//获取最后一个作业执行
JobExecution lastJobExecution=executions.get(0);
System.out.println(“我的上一个作业正在运行吗?\nAns:+lastJobExecution.isRunning());
有几件事,这段代码是检查以前所有正在运行的作业。我假设的是,如果我启动服务器,那么在服务器启动之前不会有其他作业在运行;如果我在检查前一个作业是否正在运行后运行作业,那么我假设在调度程序代码中不会调用其他作业

我想知道这样做正确吗?我的意思是要确保您在同一时间只为同一个作业运行一个作业实例,并且在完成之前对同一作业的任何运行之后也运行一个作业实例

另外,作业实例、jObExplorer和jobLauncher被注入到调度程序中。这只是一个类似的代码,因此使用上下文获取bean


谢谢你的阅读

如果您使用的是调度器,那么您可能应该有一个JobLauncherDetails类,可以在其中添加如下参数

JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);
其中一个参数可能是您的最后一次运行时间, 将dateTime参数添加到此映射并使用JobCompletionReader的实例

jobCompletionReader.getLastCompleteDate()
将其与10分钟前进行比较,看看您是否已完成“10分钟前的工作”。
类似的东西应该适合您。

JobExplorer.findRunningJobExecutions()?@LucaBassoRicci感谢您的回复,我找到了api。但是我想知道,在我使用tasklet的情况下,如果我使用基于块的编程,那么相同的方法和不同的调用(您提到的)会起作用吗?我为什么要问这个?因为区块也会有不同的执行上下文。如果我错了或缺少任何东西,请纠正我:):):)还有一件事,这是文档中的内容:检索正在运行的作业执行。根据实现情况,相应的步骤执行可能没有完全水合(例如,它们的执行上下文可能缺失)。在这种情况下,使用getStepExecution(Long,Long)将它们水合。我不太明白。