tomcat-quartz 集成的时候 关闭tomcat异常处理

在tomcat7+quartz1.8/1.7 + spring3.0.5做定时任务的时候 , 当关闭tomcat时会发现如下异常:

[java]  view plain copy
  1.         ar 272013 6:05:35 PM org.apache.coyote.AbstractProtocol pause  
  2. INFO: Pausing ProtocolHandler ["http-nio-8082"]  
  3. Mar 272013 6:05:35 PM org.apache.catalina.core.StandardService stopInternal  
  4. INFO: Stopping service Catalina  
  5. Mar 272013 6:05:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads  
  6. SEVERE: The web application [/****] appears to have started a thread named [startQuertz_Worker-1] buthas       failed to stop it. This is very likely to create a memory leak.  
  7. Mar 272013 6:05:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads  
  8. SEVERE: The web application [/****] appears to have started a thread named [startQuertz_Worker-2] buthas  failed to stop it. This is very likely to create a memory leak.  
  9. Mar 272013 6:05:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads  
  10. SEVERE: The web application [/****] appears to have started a thread named [startQuertz_Worker-3] buthas   failed to stop it. This is very likely to create a memory leak.  
  11. Mar 272013 6:05:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads  



首先怀疑线程泄漏 , 依各位前辈的经验建议 , 修改quartz的配置:

       

[html]  view plain copy
  1. <bean id="startQuertz" lazy-init="false" autowire="no"  
  2.     class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  3.     <property name="triggers">  
  4.         <list>                  
  5.               
  6.         </list>  
  7.     </property>  
  8.     <property name="quartzProperties">    
  9.        <props>    
  10.            <prop key="org.quartz.scheduler.instanceName">buy_it_now</prop>  
  11.            <prop key="org.quartz.threadPool.threadCount">2</prop>    
  12.            <prop key="org.quartz.plugin.shutdownhook.class">org.quartz.plugins.management.ShutdownHookPlugin</prop>  
  13.            <prop key="org.quartz.plugin.shutdownhook.cleanShutdown">true</prop>  
  14.            <prop key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>  
  15.        </props>    
  16.    </property>    
未果 , 以上配置只是设置了线程池的大小和在shutdown时进行清理 , 结果在老外的网站上发现了解决办法。

 

日志warn可能线程泄漏 ,但事实并非如此(本人没考证) , 只是tomcat在shutdown做清理工作的时候没能等待quartz完成cleanShutdown !就是tomcat太心急了 , 说 “quartz  , 我关门了 , 你走吧!” , 还没等quartz反应过来,

就要关大门 , 这时发现 “quartz , 你怎么还在这儿呀!”。 解决的办法简单:自己实现一个ServletContextListener ,

在contextDestroyed的时候主动调用quartz schedular的shutdown方法  ,并且主线程sleep一会儿 , 上例子:


     

[java]  view plain copy
  1. public class QuartzContextListener implements ServletContextListener {  
  2.   
  3.     /* 
  4.      * 测试代码写得随便 
  5.      *  
  6.      * @seejavax.servlet.ServletContextListener#contextDestroyed(javax.servlet. 
  7.      * ServletContextEvent) 
  8.      */  
  9.     @Override  
  10.     public void contextDestroyed(ServletContextEvent arg0) {  
  11.         WebApplicationContext webApplicationContext = (WebApplicationContext) arg0  
  12.                 .getServletContext()  
  13.                 .getAttribute(  
  14.                         WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);  
  15.         org.quartz.impl.StdScheduler startQuertz = (org.quartz.impl.StdScheduler) webApplicationContext  
  16.                 .getBean("startQuertz");  
  17.         if(startQuertz != null) {  
  18.             startQuertz.shutdown();  
  19.         }  
  20.         try {  
  21.             Thread.sleep(1000);  
  22.         } catch (InterruptedException e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.   
  27.     /* 
  28.      * (non-Javadoc) 
  29.      *  
  30.      * @see 
  31.      * javax.servlet.ServletContextListener#contextInitialized(javax.servlet 
  32.      * .ServletContextEvent) 
  33.      */  
  34.     @Override  
  35.     public void contextInitialized(ServletContextEvent arg0) {  
  36. <span style="white-space:pre">      </span>//不做任何事情  
  37.     }  
  38.   
  39. }  

  别忘了web.xml中添加起! 结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值