Domanda

Sto usando l'integrazione di Spring Quartz e ogni volta che provo a spegnere Tomcat, i processi Quartz non si arrestano. Questa è la traccia dello stack:

Exception in thread "org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread" 
        java.lang.NullPointerException
    at org.apache.commons.logging.LogFactory.getCachedFactory(LogFactory.java:979)
    at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:435)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
    at org.quartz.core.QuartzSchedulerThread.getLog(QuartzSchedulerThread.java:475)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:404)

Qualcuno l'ha mai visto prima?

È stato utile?

Soluzione

Se guardi SchedulerFactoryBean, ha una proprietà chiamata waitForJobsToCompleteOnShutdown . Quando Spring ApplicationContext riceve la richiesta di chiusura, comunica a Quartz Scheduler di arrestarsi, dicendo in modo condizionale di attendere il completamento di tutti i lavori prima di arrestarsi.

Ma Spring può elaborare la richiesta di arresto (e dire a Quartz) di arresto solo se viene avvisato del contesto Tomcat che viene eliminato. Come stai usando Spring all'interno di Tomcat? Hai un ServletContextListener registrato per chiamare applicationContext.destroy () ?

L'NPE attuale è probabilmente causato dall'impostazione di Tomcat da parte di tutti i riferimenti statici all'interno di classLoader in cui l'applicazione viene eseguita su null allo spegnimento. Lo fa per prevenire perdite di memoria durante il riciclaggio / riavvio di Tomcat. Ma se hai thread che vivono all'interno del contenitore Tomcat che sono ancora in esecuzione (perché non erano correttamente arrestati, come i thread Quartz), vedrai errori quando il codice all'interno di quel thread (come il codice all'interno del tuo Il thread di quarzo che tenta di accedere al suo logger - che è probabilmente mantenuto come static ) tenta di accedere a qualsiasi riferimento statico che è stato annullato.

Altri suggerimenti

Hai una copia della registrazione dei beni comuni inclusa nella tua GUERRA? In tal caso, potrebbe esserci una strana interazione tra la copia fornita come parte di Tomcat e la copia presente nella tua GUERRA. Prova a rimuovere la copia di WAR e vedi se aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top