Spring 如何检查Quartz作业是否正在运行?

Spring 如何检查Quartz作业是否正在运行?,spring,quartz-scheduler,spring-scheduled,Spring,Quartz Scheduler,Spring Scheduled,我有一个显示作业列表的UI。当我按下按钮job starts(作业开始)时,每个作业都已运行NOW(立即运行)按钮,并且每个作业都在特定的时间间隔内运行。 现在我想停止具体的工作,但是 scheduler.getCurrentlyExecutingJobs(); 不返回任何内容,如何获取现有作业的引用以便停止该操作。 我的职业课 public class SecondJob implements InterruptableJob{ @Override public void execute(

我有一个显示作业列表的UI。当我按下按钮job starts(作业开始)时,每个作业都已运行NOW(立即运行)按钮,并且每个作业都在特定的时间间隔内运行。 现在我想停止具体的工作,但是

scheduler.getCurrentlyExecutingJobs();
不返回任何内容,如何获取现有作业的引用以便停止该操作。 我的职业课

public class SecondJob implements InterruptableJob{

@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException {
    System.out.println("My second JOB ");
    try {
        System.out.println(" job starts ");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@Override
public void interrupt() throws UnableToInterruptJobException {
    System.out.println(" JOB STOPS");

}
}

我的控制器下面的方法运行作业

@RequestMapping(value = { "/runNow" }, method = RequestMethod.POST)
public ResponseEntity<?> runNow(@RequestParam("jobFileName") String jobFileName,
        @RequestParam("jobLocation") String jobLocation) {
    JobDetail job = JobBuilder.newJob(SecondJob.class).withIdentity(jobFileName, jobFileName).build();

    System.out.println(" runNow jobFileName   " + jobFileName);
    System.out.println("  runNow jobLocation   " + jobLocation);

    JobKey jobKey = new JobKey(jobFileName, jobFileName);
    try {

        if (scheduler == null) {
            StdSchedulerFactory stdSchedulerFactory = (StdSchedulerFactory) servletContext
                    .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
            scheduler = stdSchedulerFactory.getScheduler();
        }
        scheduler.getContext().put("jobLocation", jobLocation);
        scheduler.addJob(job, true);
        scheduler.triggerJob(jobKey);
        //schedulerFactory.getScheduler().triggerJob(jobKey);

        List<JobExecutionContext> runningJobs = scheduler.getCurrentlyExecutingJobs();
    } catch (SchedulerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return new ResponseEntity<>(HttpStatus.OK);
}
@RequestMapping(值={“/runNow”},方法=RequestMethod.POST)
public ResponseEntity runNow(@RequestParam(“jobFileName”)字符串jobFileName,
@RequestParam(“jobLocation”)字符串(jobLocation){
JobDetail job=JobBuilder.newJob(SecondJob.class).withIdentity(jobFileName,jobFileName).build();
System.out.println(“runNow jobFileName”+jobFileName);
System.out.println(“runNow jobLocation”+jobLocation);
JobKey JobKey=新的JobKey(jobFileName,jobFileName);
试一试{
if(调度程序==null){
StdSchedulerFactory StdSchedulerFactory=(StdSchedulerFactory)servletContext
.getAttribute(QuartzInitializerListener.QUARTZ\u工厂\u键);
scheduler=stdSchedulerFactory.getScheduler();
}
scheduler.getContext().put(“jobLocation”,jobLocation);
scheduler.addJob(job,true);
调度程序触发作业(jobKey);
//schedulerFactory.getScheduler().triggerJob(jobKey);
List runningJobs=scheduler.getCurrentlyExecutingJobs();
}捕获(调度){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回新的响应状态(HttpStatus.OK);
}
当我单击停止按钮时,下面的方法调用

@RequestMapping(value = { "/stopJob" }, method = RequestMethod.POST)
public ResponseEntity<?> stopJob(@RequestParam("jobFileName") String jobFileName,
        @RequestParam("jobLocation") String jobLocation) {
    //JobDetail job = JobBuilder.newJob(SecondJob.class).withIdentity(jobFileName, jobFileName).build();

    System.out.println(" stopJob jobFileName   " + jobFileName);
    System.out.println("  stopJob jobLocation   " + jobLocation);

    JobKey jobKey = new JobKey(jobFileName, jobFileName);
    try {

        if (scheduler == null) {
            StdSchedulerFactory stdSchedulerFactory = (StdSchedulerFactory) servletContext
                    .getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
            scheduler = stdSchedulerFactory.getScheduler();
        }
        List<JobExecutionContext> runningJobs = scheduler.getCurrentlyExecutingJobs();

        scheduler.getContext().put("jobLocation", jobLocation);
        //scheduler.addJob(job, true);
        scheduler.interrupt(jobKey);
        //scheduler.triggerJob(jobKey);

    } catch (SchedulerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return new ResponseEntity<>(HttpStatus.OK);
}
@RequestMapping(value={”/stopJob},method=RequestMethod.POST)
public ResponseEntity stopJob(@RequestParam(“jobFileName”)字符串jobFileName,
@RequestParam(“jobLocation”)字符串(jobLocation){
//JobDetail job=JobBuilder.newJob(SecondJob.class).withIdentity(jobFileName,jobFileName).build();
System.out.println(“stopJob jobFileName”+jobFileName);
System.out.println(“停止作业作业位置”+作业位置);
JobKey JobKey=新的JobKey(jobFileName,jobFileName);
试一试{
if(调度程序==null){
StdSchedulerFactory StdSchedulerFactory=(StdSchedulerFactory)servletContext
.getAttribute(QuartzInitializerListener.QUARTZ\u工厂\u键);
scheduler=stdSchedulerFactory.getScheduler();
}
List runningJobs=scheduler.getCurrentlyExecutingJobs();
scheduler.getContext().put(“jobLocation”,jobLocation);
//scheduler.addJob(job,true);
调度程序中断(jobKey);
//调度程序触发作业(jobKey);
}捕获(调度){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回新的响应状态(HttpStatus.OK);
}

请告诉我需要做什么来解决问题?

如果作业运行时间很短,它可能不会返回到列表中。它每1分钟运行一次。运行时间间隔为1分钟,但作业执行时间约为1毫秒,因为它只打印一行文字“作业开始”。尝试在作业内设置几分钟的线程睡眠并检查。即使我投入了更多的时间,但它仍不起作用,如果您在群集中运行,这可能不起作用。bcz此方法将从调用它的节点返回,作业同时在其他节点中运行。如果您的作业只运行很短的时间,它可能不会返回到列表中。它每1分钟运行一次。运行时间间隔为1分钟,但作业执行时间为appx 1毫秒,因为它只打印一行文字“作业开始”。尝试在作业内设置几分钟的线程睡眠并检查。即使我投入了更多时间,但它仍不起作用,如果您在集群中运行,这可能不起作用。bcz此方法将从调用它的节点返回,作业同时在其他节点中运行。