如何中断或停止当前运行的石英作业?

时间:2011-08-23 09:45:39

标签: java scheduled-tasks quartz-scheduler schedule

我有一些在Java Quartz Jobs的帮助下执行的任务,但是我需要在我的代码中通过某些条件来停止某些任务。我读到这可以通过InterruptableJob完成。但是我不明白我该怎么办呢?

6 个答案:

答案 0 :(得分:34)

你需要把你的工作写成InterruptableJob的实现。 要中断此作业,您需要处理Scheduler,并致电interrupt(jobKey<<job name & job group>>)

请看看@ javadoc上面的类,石英发行版也包含一个例子(例7)。

答案 1 :(得分:4)

在Quartz 2.1 with Spring中你可以:

@Autowired
private Scheduler schedulerFactoryBean; //injected by spring
...
...

List<JobExecutionContext> currentlyExecuting = schedulerFactoryBean.getCurrentlyExecutingJobs();

//verifying if job is running       
for (JobExecutionContext jobExecutionContext : currentlyExecuting) {
    if(jobExecutionContext.getJobDetail().getKey().getName().equals("JobKeyNameToInterrupt")){
        result = schedulerFactoryBean.interrupt(jobExecutionContext.getJobDetail().getKey());
    }
}

答案 2 :(得分:1)

我认为最好的解决方案是本主题中描述的解决方案:http://forums.terracotta.org/forums/posts/list/7700.page

我刚刚将stop stop标志设置为true后引入了“sleep”,以使作业干净利落。

    @Override
public void interrupt() throws UnableToInterruptJobException {
    stopFlag.set(true);
    try {
        Thread.sleep(30000);
    } catch (InterruptedException e) {
        //logger.error("interrupt()", e);
    }
    Thread thread = runningThread.getAndSet(null);
    if (thread != null)
        thread.interrupt();
}

答案 3 :(得分:0)

我不知道为什么没有人提到这一点,或者在提出问题时可能无法提及。

对于Scheduler实例,有一种名为shutdown的方法。

 SchedulerFactory factory = new StdSchedulerFactor();
 Scheduler scheduler = factory.getScheduler();

以上用于开始像

这样的工作
 scheduler.start();

使用标记或其他内容来了解​​何时停止作业运行。 然后使用

 scheduler.shutdown();

我如何实现我的要求:

if(flag==true)
    {
        scheduler.start();
        scheduler.scheduleJob(jobDetail, simpleTrigger);
    }
    else if(flag==false)
    {
        scheduler.shutdown();
    }

其中jobDetail和simpleTrigger是自解释的。

希望它有所帮助。 :)

答案 4 :(得分:0)

回答这个问题可能有点晚了,但也许可以帮上忙:

如果您不再需要工作,则可以使用删除该特定工作

scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));

此方法只会中断/停止由计划程序中的“作业密钥”和“组”唯一标识的作业,该作业可能正在运行许多其他作业。

另一方面,如果您想完全关闭调度程序及其中的所有作业,则可以执行

scheduler.shutdown();

This是与工作相关的不同任务的一个很好的例子。

答案 5 :(得分:0)

中断所有正在运行的作业

for (JobExecutionContext currentlyExecutingJob : scheduler.getCurrentlyExecutingJobs()) {
    if (InterruptableJob.class.isAssignableFrom(currentlyExecutingJob.getJobDetail().getJobClass())) // Otherwise it will throw an exception
        scheduler.interrupt(currentlyExecutingJob.getFireInstanceId());
}

您可以在 JobExecutionContext 中获取职位信息、检索职位类或类似内容。