我有一些在Java Quartz Jobs的帮助下执行的任务,但是我需要在我的代码中通过某些条件来停止某些任务。我读到这可以通过InterruptableJob完成。但是我不明白我该怎么办呢?
答案 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
中获取职位信息、检索职位类或类似内容。