tomcat中多線程web服務的關閉

 

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

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章