Ошибка при запуске / остановке Tomcat 6.0.29 - PullRequest
6 голосов
/ 31 марта 2011

Я настроил некоторые планировщики весной. Когда я пытаюсь запустить свое веб-приложение, оно выдает следующую ошибку и останавливается. Мое приложение фактически не запускается. Мой планировщик выглядит примерно так также, когда я выключаю tomcat, некоторые кварцевые нити незавершение работы

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method="destroy">
    <property name="triggers">
        <list>
           <ref bean="scheduler.localAdaptorCronTrigger"/>
        </list>
    </property>
</bean>   

<bean id="localAdaptor" class="LocalAdaptor" />

<bean id="scheduler.localFSSlaAdaptorJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="Adaptor"/>
        <property name="targetMethod" value="xxxxxx"/>
</bean>

<bean id="scheduler.localAdaptorCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="scheduler.localAdaptorJobDetail"/>
        <!-- run every morning at 12 AM -->
      <property name="cronExpression" value="0 0 0 * * ?"/>
    </bean>
    <bean id="scheduler.localFSSlaAdaptorSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <!-- see the example of method invoking job above -->
        <property name="jobDetail" ref="scheduler.localAdaptorJobDetail"/>
        <!-- runs after 10 seconds for single time...-->
        <property name="startDelay" value="1000"/>
        <!-- repeated once -->
        <property name="repeatCount" value="0"/>
        <!-- useless as the repeat count is 0, so it will run once after 10 seconds of the startup of the application.... -->
        <property name="repeatInterval" value="60000"/>
</bean>

Stacktrace:

INFO: Closing Spring root WebApplicationContext
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak.
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/c] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1] but has failed to stop it. This is very likely to create a memory leak.
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] but has failed to stop it. This is very likely to create a memory leak.
Mar 31, 2011 10:02:22 AM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@71ee88dd]) and a value of type [org.apache.cxf.bus.CXFBusImpl] (value [org.apache.cxf.bus.CXFBusImpl@409468ca]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

Я реализовал слушатель:

import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import org.quartz.SchedulerException;
 import org.quartz.impl.StdSchedulerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;


 public class QuartzServletContextListener implements ServletContextListener {

     final Logger log = LoggerFactory.getLogger(QuartzServletContextListener.class);
     public static final String QUARTZ_FACTORY_KEY =
             "org.quartz.impl.StdSchedulerFactory.KEY";
     private ServletContext ctx = null;
     private StdSchedulerFactory factory = null;

     public void contextInitialized(ServletContextEvent sce) {
         ctx = sce.getServletContext();

         try {

             factory = new StdSchedulerFactory();

             // Start the scheduler now

             factory.getScheduler().start();

             log.info("Storing QuartzScheduler Factory at"
                     + QUARTZ_FACTORY_KEY);

             ctx.setAttribute(QUARTZ_FACTORY_KEY, factory);

         } catch (Exception ex) {
             log.error("Quartz failed to initialize", ex);
         }
     }

     public void contextDestroyed(ServletContextEvent sce) {
         try {

             log.info("shutting down");
             factory.getScheduler().shutdown();
             Thread.sleep(1000);
         } catch (InterruptedException ex) {
             log.error("Quartz failed to shutdown", ex);
         } catch (SchedulerException ex) {
             log.error("Quartz failed to shutdown", ex);
         }
     }
 }

И добавил в web.xml

<listener>
        <listener-class>xx.yy.QuartzServletContextListener</listener-class>
    </listener>

Когда я пытаюсь использовать shutdown.sh, я все еще могу активировать некоторые потоки и активировать Java-процесс tomcat.

Также следует упомянуть, что у меня есть 3-4 планировщика для различных заданий, как упомянуто выше в контексте приложения.

Ответы [ 3 ]

6 голосов
/ 31 марта 2011

Что касается любых ресурсов, связанных с Quartz, о которых сообщает Tomcat, то это связано с тем, что Tomcat немного перегружен поиском несвободных ресурсов, когда Quartz требуется более нескольких миллисекунд для выключения своих ресурсов.

См. Обсуждение здесь (вместе с простым обходным путем):

http://forums.terracotta.org/forums/posts/list/3479.page

5 голосов
/ 31 марта 2011

Это не проблема. Tomcat автоматически удаляет нежелательные потоки и локальные потоки, но просто сообщает вам, что ваш код или библиотеки делают что-то «рискованное».

Возможно, вы захотите сообщить в соответствующие библиотеки (c3p0 и CXF) о проблемах, которые они должны устранить при завершении работы.

0 голосов
/ 07 марта 2013

Единственный способ обеспечить завершение потоков - это прервать их и присоединить к ним.

Это можно сделать путем реализации org.quartz.InterruptableJob, как описано в ответе на вопрос. Как предотвратить утечку памяти в кварце [?] .

...