2013-02-22 1 views
6

Je reçois le planificateur comme suit:Quartz - Comment arrêter et redémarrer le planificateur?

StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName); 
schedulerBean.start(); 

et plus tard

schedulerBean.shutdown(); 

après l'exécution de quelques autres codes, alors je fais appel schedulerBean.start() à nouveau.

Maintenant, le code génère l'erreur - « org.quartz.SchedulerException: Le planificateur ne peut pas être redémarré après l'arrêt() a été appelé »

Pourriez-vous s'il vous plaît me faire savoir comment résoudre le problème?

Merci à l'avance, Kathir

Répondre

7

Une fois que vous avez un arrêt planificateur, il ne peut pas être remis en marche en tant que fils et d'autres ressources sont définitivement détruites. Vous pouvez lire le Quartz Scheduler API references afin de trouver la méthode qui couvre vos besoins. Ci-dessous vous pouvez trouver quelques méthodes disponibles.

  • standby() méthode. Arrête temporairement le déclenchement des Triggers par le Scheduler. Lorsque start() est appelé (pour sortir le programmateur du mode veille), les instructions de ratés de déclenchement ne seront PAS appliquées pendant l'exécution de la méthode start() - tout raté sera détecté immédiatement après (par le processus normal du JobStore) .
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey). Mettez le JobDetail en pause avec la clé donnée - en mettant en pause tous ses déclencheurs actuels. Sur resumeJob (JobKey jobKey) si l'un des JobSTrigger a manqué un ou plusieurs fire-times, l'instruction de rattrapage du Trigger sera appliquée.
  • interrupt(JobKey jobKey). Demander l'interruption, dans cette instance de planificateur, de toutes les instances en cours d'exécution du Job identifié, qui doit être un implémenteur de l'interface InterruptableJob. Si plus d'une instance du travail identifié est en cours d'exécution, la méthode InterruptableJob # interrupt() sera appelée sur chaque instance. Cependant, il y a une limitation au cas où l'interruption() sur une instance lève une exception, toutes les instances restantes (qui n'ont pas encore été interrompues) n'auront pas leur méthode d'interruption() appelée. Si vous souhaitez interrompre une instance spécifique d'un travail (lorsque plusieurs sont en cours d'exécution), vous pouvez le faire en appelant getCurrentlyExecutingJobs() pour obtenir un handle de l'instance de travail, puis invoquez l'interruption() dessus. Cette méthode n'est pas sensible au cluster. En d'autres termes, il interrompt uniquement les instances de l'InterruptableJob identifié en cours d'exécution dans cette instance du planificateur, et non sur l'ensemble du cluster.
  • unscheduleJob(TriggerKey triggerKey). Retirez le déclencheur indiqué du planificateur. Si le travail associé n'a aucun autre déclencheur et que le travail n'est pas durable, le travail sera également supprimé.

Notez que vous pouvez créer un écouteur qui implémente l'interface ServletContextListener de telle sorte que:

  • tous les travaux sont interrompus et le planificateur est arrêté lorsque le conteneur est en cours d'arrêt
  • le planificateur est créé et les travaux sont planifiés lorsque le conteneur est démarré

Dans le cas où vous souhaitez créer un tel écouteur, je pourrais fournir plus de détails.

J'espère que cela aide. Standby et start() résout le problème.

+1

merci pour les détails. (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir

+0

Appelez juste scheduler.standby(), puis scheduler.start() ne fonctionne pas. – aloplop85

+0

Pouvez-vous fournir des détails sur la façon d'écrire ServletContextListener pour interrompre tous les travaux en cours et leur demander de prendre des mesures? – Vipul

Questions connexes