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?
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).
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());
}
}
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();
}
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. :)