2013-02-22 14 views
6

sto ottenendo lo scheduler come segue:Quartz - Come spegnere e riavviare lo scheduler?

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

e successivamente

schedulerBean.shutdown(); 

dopo aver eseguito alcuni altri codici, quindi vi invito ancora una volta() schedulerBean.start.

Ora il codice genera l'errore - "org.quartz.SchedulerException: La pianificazione non può essere riavviato dopo l'arresto() è stato chiamato"

La prego di farmi sapere come risolvere il problema?

Grazie in anticipo, Kathir

risposta

7

Una volta che avete l'arresto un programmatore, non possono essere riavviati come le discussioni e le altre risorse sono permanentemente distrutte.

Si può leggere il Quartz Scheduler API references per trovare il metodo che copre le vostre esigenze. Di seguito puoi trovare alcuni metodi disponibili.

  • metodo standby(). Interrompe temporaneamente l'attivazione dello Scheduler di Trigger. Quando viene chiamato start() (per portare lo scheduler fuori dalla modalità stand-by), le istruzioni di accensione errata NON verranno applicate durante l'esecuzione del metodo start() - eventuali mancate rilevazioni verranno immediatamente rilevate (dal normale processo di JobStore) .
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey). Metti in pausa JobDetail con la chiave specificata, mettendo in pausa tutti i Trigger correnti. Su resumeJob (JobKey jobKey) se uno qualsiasi dei Job'sTrigger ha perso uno o più tempi di attivazione, verrà applicata l'istruzione di accensione irregolare di Trigger.
  • interrupt(JobKey jobKey). Richiedere l'interruzione, all'interno dell'istanza di Scheduler, di tutte le istanze attualmente in esecuzione del Job identificato, che deve essere un implementatore dell'interfaccia InterruptableJob. Se più di un'istanza del lavoro identificato è attualmente in esecuzione, il metodo InterruptableJob # interrupt() verrà chiamato su ogni istanza. Tuttavia, esiste una limitazione nel caso in cui interrupt() su una istanza generi un'eccezione, tutte le istanze rimanenti (che non sono state ancora interrotte) non avranno il loro metodo interrupt() chiamato. Se si desidera interrompere un'istanza specifica di un lavoro (quando ne è in esecuzione più di una), è possibile farlo chiamando getCurrentlyExecutingJobs() per ottenere un handle per l'istanza di lavoro e quindi richiamare interrupt() su di essa. Questo metodo non è a conoscenza del cluster. Cioè, interromperà solo le istanze del InterruptableJob identificato attualmente in esecuzione in questa istanza Scheduler, non attraverso l'intero cluster.
  • unscheduleJob(TriggerKey triggerKey). Rimuovere il trigger indicato dallo scheduler. Se il lavoro correlato non ha altri trigger e il lavoro non è durevole, anche il lavoro verrà eliminato.

noti che è possibile creare un listener che implementa l'interfaccia ServletContextListener in modo che:

  • tutti i lavori vengono interrotti e l'utilità di pianificazione viene arrestato quando il contenitore si sta spegnendo
  • si crea lo scheduler e i lavori sono programmati all'avvio del contenitore

Nel caso in cui si desideri creare un ascoltatore di questo tipo, è possibile fornire ulteriori dettagli.

Spero che questo aiuti.

+1

standby e start() risolve il problema. grazie per i dettagli (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir

+0

Chiamando solo scheduler.standby() e quindi scheduler.start() non funziona. – aloplop85

+0

Potete fornire dettagli su come scrivere ServletContextListener per interrompere tutti i lavori in esecuzione e chiedere loro di intervenire. – Vipul

Problemi correlati