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