У меня есть некоторые задачи, которые выполняются с помощью Java Quartz Jobs, но мне нужно остановить некоторые задачи по какому-то условию в моем коде. Я читал, что это можно сделать через InterruptableJob. Но я не понял, как мне это сделать?
Как прервать или остановить текущую работу кварца?
Ответы (6)
Вам нужно написать свою работу как реализацию InterruptableJob< /а>. Чтобы прервать это задание, вам нужен дескриптор Scheduler и позвоните interrupt(jobKey<<job name & job group>>)
Пожалуйста, посмотрите @ javadoc для вышеуказанных классов, также дистрибутив кварца содержит пример для этого (example7).
В Quartz 2.1 с 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());
}
}
На мой взгляд, лучшим решением является то, что описано в этой теме: 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();
}
Я не знаю, почему никто не упомянул об этом, или, может быть, это было недоступно в то время, когда был задан вопрос.
Существует метод, называемый выключением экземпляра планировщика.
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();
Это довольно хороший пример различных задач, связанных с работой.
Чтобы прервать все запущенные задания
for (JobExecutionContext currentlyExecutingJob : scheduler.getCurrentlyExecutingJobs()) {
if (InterruptableJob.class.isAssignableFrom(currentlyExecutingJob.getJobDetail().getJobClass())) // Otherwise it will throw an exception
scheduler.interrupt(currentlyExecutingJob.getFireInstanceId());
}
Вы можете получить информацию о вакансиях в JobExecutionContext
, получить класс Job или что-то в этом роде.