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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM