我有一些在Java Quartz Jobs的帮助下执行的任务,但我需要在代码中通过某些条件来停止某些任务。我读到这可以通过InterruptableJob完成。但我不明白我该怎么做呢?
你需要写一份你的工作作为InterruptableJob的实现。要中断此工作,您需要处理Scheduler,并调用interrupt(jobKey<<job name & job group>>)
请看看@ javadoc上面的类,石英发行版也包含一个例子(例子7)。
在使用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
我刚刚将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();
}
我不知道为什么没有人提到这一点,或者在问到这个问题时可能没有这个。
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是自解释的。
希望能帮助到你。 :)
回答这个问题可能有点晚了,但可能会有所帮助:
如果您不再需要某个作业,则可以使用删除该特定作业
scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));
此方法仅中断/停止由调度程序中的作业键和组唯一标识的作业,该作业可能有许多其他作业正在运行。
另一方面,如果要完全关闭调度程序以及其中的所有作业,则可以执行此操作
scheduler.shutdown();
This是不同工作相关任务的一个很好的例子。