Как прервать или остановить текущую работу кварца?

У меня есть некоторые задачи, которые выполняются с помощью Java Quartz Jobs, но мне нужно остановить некоторые задачи по какому-то условию в моем коде. Я читал, что это можно сделать через InterruptableJob. Но я не понял, как мне это сделать?


person breedish    schedule 23.08.2011    source источник


Ответы (6)


Вам нужно написать свою работу как реализацию InterruptableJob< /а>. Чтобы прервать это задание, вам нужен дескриптор Scheduler и позвоните interrupt(jobKey<<job name & job group>>)

Пожалуйста, посмотрите @ javadoc для вышеуказанных классов, также дистрибутив кварца содержит пример для этого (example7).

person blob    schedule 23.08.2011
comment
Ограничение этого подхода — не наличие кластера. Документация по Java: Этот метод не поддерживает кластер. То есть он будет прерывать только экземпляры идентифицированного InterruptableJob, которые в данный момент выполняются в этом экземпляре планировщика, а не во всем кластере. - person 卢声远 Shengyuan Lu; 28.04.2016

В 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());
    }
}
person fl4l    schedule 25.06.2013

На мой взгляд, лучшим решением является то, что описано в этой теме: 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();
}
person melfore    schedule 02.11.2014

Я не знаю, почему никто не упомянул об этом, или, может быть, это было недоступно в то время, когда был задан вопрос.

Существует метод, называемый выключением экземпляра планировщика.

 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 говорят сами за себя.

Надеюсь, поможет. :)

person Nikhil Kumar    schedule 21.05.2015
comment
Это решение отключает весь планировщик, что не совсем правильно, если у вас нет одного задания, назначенного планировщику. У вас должен быть способ удалить только определенное задание, а не весь планировщик, потому что в одном и том же планировщике может быть запущено более одного задания. - person Salman; 18.10.2015
comment
Имея более одного задания в планировщике? Я бы даже сказал, что это чрезвычайно распространено, и в этом случае закрытие планировщика было бы катастрофой. - person Jolta; 20.03.2019

Возможно, немного поздно ответить на этот вопрос, но, возможно, это может помочь:

Если вам больше не нужна работа, вы можете удалить эту конкретную работу, используя

scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));

Этот метод будет прерывать/останавливать только задание, уникально идентифицированное с помощью ключа задания и группы в планировщике, в котором может выполняться много других заданий.

С другой стороны, если вы хотите полностью отключить планировщик и все его задания, вы можете выполнить

scheduler.shutdown();

Это довольно хороший пример различных задач, связанных с работой.

person Swapnil B.    schedule 18.03.2019

Чтобы прервать все запущенные задания

for (JobExecutionContext currentlyExecutingJob : scheduler.getCurrentlyExecutingJobs()) {
    if (InterruptableJob.class.isAssignableFrom(currentlyExecutingJob.getJobDetail().getJobClass())) // Otherwise it will throw an exception
        scheduler.interrupt(currentlyExecutingJob.getFireInstanceId());
}

Вы можете получить информацию о вакансиях в JobExecutionContext, получить класс Job или что-то в этом роде.

person apflieger    schedule 06.04.2021