web-dev-qa-db-fra.com

Comment interrompre ou arrêter le travail de quartz en cours d'exécution?

J'ai certaines tâches qui sont exécutées à l'aide de Java Quartz Jobs, mais je dois arrêter certaines tâches par une condition dans mon code. J'ai lu que cela peut être fait via InterruptableJob. Mais je ne comprenais pas de quelle manière je devais le faire?

19
breedish

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

Veuillez regarder @ javadoc pour les classes ci-dessus, la distribution de quartz contient également un exemple pour cela (exemple7).

34
blob

Dans Quartz 2.1 avec Spring, 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
fl4l

La meilleure solution à mon avis est celle décrite dans ce fil: http://forums.terracotta.org/forums/posts/list/7700.page

Je viens d'introduire un "sommeil" après avoir défini l'indicateur d'arrêt sur true pour permettre au travail de se terminer 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();
}
1
melfore

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

Il existe une méthode appelée arrêt pour une instance du planificateur.

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

Ce qui précède est utilisé pour démarrer un travail comme

 scheduler.start();

Utilisez un indicateur ou quelque chose pour savoir quand arrêter l'exécution du travail. Ensuite, utilisez

 scheduler.shutdown();

Comment j'ai mis en œuvre mon exigence:

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

Où jobDetail et simpleTrigger sont explicites.

J'espère que ça aide. :)

0
Nikhil Kumar

Probablement un peu tard pour répondre à cette question, mais cela peut être utile:

Si vous n'avez plus besoin d'un travail, vous pouvez le supprimer en utilisant

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

Cette méthode interrompra/arrêtera uniquement le travail identifié de manière unique par la clé et le groupe de travaux dans le planificateur, qui peut avoir de nombreux autres travaux en cours d'exécution.

D'un autre côté, si vous voulez arrêter complètement le planificateur et tous les travaux qu'il peut faire

scheduler.shutdown();

This est un joli bel exemple de différentes tâches liées au travail.

0
Swapnil B.