Comment interrompre ou arrêter quartz job?

j'ai quelques tâches qui sont exécutées avec l'aide de Java Quartz Emplois, mais j'ai besoin d'arrêter certaines tâches par certaines condition dans mon code. J'ai lu que cela peut être fait via InterruptableJob. Mais je n'ai pas compris comment je devais le faire?

18
demandé sur Sangram Anand 2011-08-23 13:45:38

4 réponses

vous devez écrire votre travail comme une implémentation de InterruptableJob. Pour interrompre ce travail, vous avez besoin de gérer Planificateur , et appeler interrupt(jobKey<<job name & job group>>)

Merci d'avoir un look @ javadoc pour les classes ci-dessus, également quartz de distribution contient un exemple de ce (example7).

33
répondu blob 2014-09-16 22:24:05

dans Quartz 2.1 avec ressort vous pouvez:

@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());
    }
}
4
répondu fl4l 2013-06-25 14:01:33

La meilleure solution à mon avis est celui décrit dans ce thread: http://forums.terracotta.org/forums/posts/list/7700.page

je viens d'introduire un "sommeil" après avoir mis stop à true pour permettre au travail de finir proprement.

    @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();
}
2
répondu melfore 2014-11-02 10:36:03

Je ne sais pas pourquoi personne n'a mentionné cela, ou peut-être que cela n'était pas disponible au moment où la question a été posée.

il existe une méthode appelée shutdown pour une instance Scheduler.

 SchedulerFactory factory = new StdSchedulerFactor();
 Scheduler scheduler = factory.getScheduler();

ce qui précède est utilisé pour lancer un travail comme

 scheduler.start();

utilisez un drapeau ou quelque chose pour savoir quand arrêter le travail de courir. Ensuite, utilisez

 scheduler.shutdown();

Comment j'ai mis en place mon exigence:

if(flag==true)
    {
        scheduler.start();
        scheduler.scheduleJob(jobDetail, simpleTrigger);
    }
    else if(flag==false)
    {
        scheduler.shutdown();
    }

j'Espère que ça aide. :)

2
répondu Nikhil Kumar 2015-05-21 15:27:41