問題:
將多線程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進程也就能被順利關閉了
推薦一個自己業余時間開發的網盤搜索引擎,360盤搜(www.360panso.com)