22

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

4

6 回答 6

36

您需要编写一个作业作为InterruptableJob的实现。要中断此作业,您需要处理Scheduler并调用interrupt(jobKey<<job name & job group>>)

请查看@javadoc 以了解上述类,quartz 发行版也包含一个示例(example7)。

于 2011-08-23T10:36:52.513 回答
5

在带有 Spring 的 Quartz 2.1 中,您可以:

@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());
    }
}
于 2013-06-25T14:01:33.840 回答
1

我认为最好的解决方案是这个线程中描述的一个:http ://forums.terracotta.org/forums/posts/list/7700.page

我刚刚在将停止标志设置为 true 后引入了“睡眠”,以允许作业干净地完成。

    @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();
}
于 2014-11-02T10:36:03.863 回答
1

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

调度程序实例有一个称为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 是不言自明的。

希望能帮助到你。:)

于 2015-05-21T15:27:41.663 回答
0

回答这个问题可能有点晚了,但可能会有所帮助:

如果您不再需要某个作业,您可以使用删除该特定作业

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

此方法只会中断/停止由调度程序中的 Job Key 和 Group 唯一标识的作业,该作业可能有许多其他作业正在运行。

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

scheduler.shutdown();

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

于 2019-03-18T17:39:31.083 回答
0

中断所有正在运行的作业

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

您可以在 中获取工作信息JobExecutionContext,检索 Job 类或类似的东西。

于 2021-04-06T13:26:59.073 回答