tomcat中多線程web服務的關閉
問題:
將多線程web服務部署於tomcat中,該web服務中的子線程一直在運行(或時不時被觸發運行),關閉tomcat後,該web服務沒有被同時關掉(windows系統中表現爲tomcat.exe進程已經關閉,java.exe進程依舊存在,並且在繼續執行)
解決方法:
新建一個監聽類,該類實現ServletContextListener接口中的contextInitiialized()方法和contextDestroyed()方法。然後在tomcat中註冊該監聽類,開啓或關閉tomcat時,都將先執行該監聽類
1、舉例:新建監聽類CgmIndexListener
package com.saas.cgm; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; //若使用ServletContextListener接口,可能需添加javax.servlet-5.1.12.jar或其它庫 public class CgmIndexListener implements ServletContextListener{ private static ExecutorService exec = Executors.newCachedThreadPool();//線程池 //關閉tomcat前關閉線程 public void contextDestroyed(ServletContextEvent arg0) { exec.shutdownNow();; } //開啓tomcat前執行線程 public contextInitiialized(ServletContextEvent arg0) { RamIndexWriter ramIndexWriter = new RamIndexWriter();//新建一個線程 exec.execute(ramIndexWriter); }
2、註冊該監聽類:在tomcat安裝目錄下的conf文件夾內的web.xml文件中添加:
<listener> <listener-class>com.saas.cgm.CgmIndexListener</listener-class> </listener>
添加完如下所示:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- The mappings for the JSP servlet --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jspx</url-pattern> </servlet-mapping> <!--在此之後添加--> <listener> <listener-class>com.saas.cgm.CgmIndexListener</listener-class> </listener>
3、此時,關閉tomcat時,tomcat首先關閉線程池exec中的ramIndexWriter 線程,當沒有子線程在運行時,java.exe進程也就能被順利關閉了
轉自http://www.cnblogs.com/eczhou/archive/2012/03/26/2418201.html