Как прервать или остановить запущенную в данный момент кварцевую работу? - PullRequest
19 голосов
/ 23 августа 2011

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

Ответы [ 5 ]

34 голосов
/ 23 августа 2011

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

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

4 голосов
/ 25 июня 2013

В Кварце 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());
    }
}
1 голос
/ 02 ноября 2014

Лучшее решение, на мой взгляд, это решение, описанное в этой теме: http://forums.terracotta.org/forums/posts/list/7700.page

Я только что ввел «спящий режим» после того, как установил флаг остановки в значение «истина», чтобы обеспечить чистое завершение работы.

    @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();
}
0 голосов
/ 18 марта 2019

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

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

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

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

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

scheduler.shutdown();

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

0 голосов
/ 21 мая 2015

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

Для экземпляра планировщика существует метод 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 говорят сами за себя.

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

...