Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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();
}