2014-06-24 14 views
6

Uso le seguenti librerie.Spring + Quartz = Memory Leaks

  • quarzo-2.2.1
  • primavera-webmvc-3.2.9.RELEASE

su Apache Tomcat/7.0.52 (Ubuntu).

Uso Spring per configurare Quarzo.

@Configuration 
class QuartzConfig { 
    @Bean 
    FactoryBean<Scheduler> scheduler() { 
     final SchedulerFactoryBean factory = new SchedulerFactoryBeanWithShutdownDelay(); 
     final Map<String, Object> map = new LinkedHashMap<>(); 
     map.put("settingsService", settingsService); 
     final List<AbstractQuartzJob> jobs = new LinkedList<>(); 
     jobs.add(dbBackupJob()); 
     jobs.add(csvExportJob()); 
     jobs.add(csvImportJob()); 
     jobs.add(dbMaintenanceJob()); 
     jobs.add(filesystemCleanupJob()); 
     map.put("jobs", jobs); 
     factory.setSchedulerContextAsMap(map); 
     factory.setTriggers(new Trigger[] {cronTrigger}); 
     return factory; 
    } 
} 

Cercato molto oggi perché le attività di pianificazione in cui si arresta correttamente ...

Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-2] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-3] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-4] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-5] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-6] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-7] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-8] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-9] but has failed to stop it. This is very likely to create a memory leak. 
Jun 24, 2014 5:14:38 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/feeder##1.5.0] appears to have started a thread named [scheduler_Worker-10] but has failed to stop it. This is very likely to create a memory leak. 

Il brutto hack era di scrivere la classe SchedulerFactoryBeanWithShutdownDelay.

public class SchedulerFactoryBeanWithShutdownDelay extends SchedulerFactoryBean { 
    private static final int SHUTDOWN_TIMEOUT = 2000; 

    @Override 
    public void destroy() throws SchedulerException { 
     log.debug("Start shutdown of Quartz scheduler factory bean"); 
     super.destroy(); 
     try { 
      log.debug("wait {}ms to shutdown Quartz", SHUTDOWN_TIMEOUT); 
      Thread.sleep(SHUTDOWN_TIMEOUT); 
      log.debug("Quartz scheduler shutdown completed"); 
     } catch (InterruptedException e) { 
      log.error("", e); 
     } 
    } 
} 

Ma questo problema avrebbe dovuto essere chiuso: https://jira.terracotta.org/jira/browse/QTZ-192

ho io commesso un errore o può questo essere confermato?

+0

Solo per curiosità, perché utilizzare i quarti quando Spring ha il proprio programmatore incorporato? –

+0

Perché no? Forse è storicamente. L'ho usato da quando abbiamo avviato il progetto e lavorato piuttosto bene, tranne i problemi durante l'arresto o il riavvio dell'applicazione web che non era un problema per noi. – Nabor

+3

Hai effettivamente una perdita di memoria o sei appena portato via con i messaggi nel tuo logfile? Si noti inoltre che primavera richiama di default 'scheduler.shutdown (false)' mentre il problema menziona 'scheduler.shutdown (true)'. Per abilitare quest'ultimo impostare la proprietà 'waitForJobsToCompleteOnShutdown' su' SchedulerFactoryBean' su 'true'. –

risposta

2

Un excellent article su perdite di memoria in Tomcat. Leggi l'articolo, avvia la tua app Web, lascia eseguire i processi Quartz, quindi ferma l'app Web, quindi esegui un dump dell'heap di Tomcat, carica il dump dell'heap in Eclipse MAT e scopri quali classi causano perdite di memoria. Quindi dovresti essere in grado di risolvere il problema.