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进程也就能被顺利关闭了
推荐一个自己业余时间开发的网盘搜索引擎,360盘搜(www.360panso.com)