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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值