我有一些任务是在 Java Quartz Jobs 的帮助下执行的,但是我需要通过代码中的某些条件来停止一些任务。我读到这可以通过 InterruptableJob 来完成。但我不明白我应该怎么做?
6 回答
您需要编写一个作业作为InterruptableJob的实现。要中断此作业,您需要处理Scheduler并调用interrupt(jobKey<<job name & job group>>)
请查看@javadoc 以了解上述类,quartz 发行版也包含一个示例(example7)。
在带有 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());
}
}
我认为最好的解决方案是这个线程中描述的一个: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();
}
我不知道为什么没有人提到这一点,或者在提出问题时这可能不可用。
调度程序实例有一个称为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 是不言自明的。
希望能帮助到你。:)
回答这个问题可能有点晚了,但可能会有所帮助:
如果您不再需要某个作业,您可以使用删除该特定作业
scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));
此方法只会中断/停止由调度程序中的 Job Key 和 Group 唯一标识的作业,该作业可能有许多其他作业正在运行。
另一方面,如果您想完全关闭调度程序以及其中的所有作业,您可以执行
scheduler.shutdown();
这 是不同工作相关任务的一个很好的例子。
中断所有正在运行的作业
for (JobExecutionContext currentlyExecutingJob : scheduler.getCurrentlyExecutingJobs()) {
if (InterruptableJob.class.isAssignableFrom(currentlyExecutingJob.getJobDetail().getJobClass())) // Otherwise it will throw an exception
scheduler.interrupt(currentlyExecutingJob.getFireInstanceId());
}
您可以在 中获取工作信息JobExecutionContext
,检索 Job 类或类似的东西。