У меня есть некоторые задачи, которые выполняются с помощью Java Quartz Jobs, но мне нужно остановить некоторые задачи некоторым условием в моем коде. Я читал, что это можно сделать через InterruptableJob. Но я не понял, каким образом я должен это делать?
Как прервать или остановить текущую работу кварца?
Ответ 1
Вам нужно написать свою работу как реализацию InterruptableJob.
Чтобы прервать это задание, вам понадобится дескриптор Scheduler и вызовите interrupt(jobKey<<job name & job group>>)
Пожалуйста, посмотрите @javadoc для вышеуказанных классов, а также дистрибутив кварца содержит пример для этого (пример7).
Ответ 2
В 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());
}
}
Ответ 3
Я не знаю, почему никто не упоминал об этом, или, возможно, это было недоступно в тот момент, когда был задан вопрос.
Существует метод, называемый shutdown для экземпляра Scheduler.
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
Лучшим решением, на мой взгляд, является тот, который описан в этой теме: http://forums.terracotta.org/forums/posts/list/7700.page
Я только что представил "sleep" после того, как флаг set 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();
}