java 如何中断或停止当前正在运行的quartz作业?

z4bn682m  于 2023-04-19  发布在  Java
关注(0)|答案(6)|浏览(549)

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

zy1mlcev

zy1mlcev1#

您需要将作业编写为InterruptableJob的实现。
请查看@ javadoc上面的类,quartz发行版也包含一个例子(example 7)。

hfsqlsce

hfsqlsce2#

在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());
    }
}
mrphzbgm

mrphzbgm3#

在我看来,最好的解决方案是在这个线程中描述的:http://forums.terracotta.org/forums/posts/list/7700.page
我刚刚引入了一个“sleep”,在设置stop标志为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();
}
ffdz8vbo

ffdz8vbo4#

我不知道为什么没有人提到这一点,或者在提出问题的时候没有这一点。
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是自解释的。
希望有帮助:)

iecba09b

iecba09b5#

回答这个问题可能有点晚,但可能会有所帮助:
如果不再需要某个作业,可以使用

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

此方法将仅中断/停止由调度程序内的作业键和组唯一标识的作业,该作业可能有许多其他作业正在运行。
另一方面,如果您想完全关闭调度程序和其中的所有作业,您可以这样做

scheduler.shutdown();

This是一个很好的例子,它展示了不同的工作相关任务。

y1aodyip

y1aodyip6#

中断所有正在运行的作业

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

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

相关问题