论坛首页 Java企业应用论坛

Tomcat不能shutdown

浏览 7567 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-23  
我有一个后台应用程序,是多线程的,没有web界面,但我是用web方式部署的,即在web.xml里配置了监听器,监听器的  public void contextInitialized(ServletContextEvent event) 函数里实例化我那个后台程序并启动那个主应用线程(这个主线程开始后还会启很多工作线程)。现在的问题是,我执行了tomcat的shutdown.sh脚本后,tomcat的8080端口已经关闭了,但ps看系统进程依然还有那个tomcat,我那个应用里会启一个定时任务线程,每隔数秒会打印一些东西,现在shutdown以后它依然在打印。所以每次想彻底的停止我的那个应用,必须kill掉tomcat的进程才可以。 执行shutdown脚本或者在Tomcat Web Application Manager 里单独stop我那个应用都不行。

所以我想问的问题是:
1、这个问题的产生原因?
2、像我这样的应用方式应该注意些什么?在监听器里启动的线程的生命周期如何维护?
3、tomcat shutdown时会作哪些操作? 在Tomcat Web Application Manager 里stop或者 reload一个webapp时又会做那些操作? 对于在和tomcat启动时一同启动的非servlet线程,那些关闭或停止操作会对它们有何影响?
   发表时间:2008-01-23  
我没有实际试验,只是试作分析。

对第一个问题,我认为startup.sh实际上是start一个tomcat非daemon线程,类似的shutdown也就是关闭这个线程。由于你在应用部署时开始新的线程,我想你的线程应该也是非daemon的,这个线程在shutdown不会被关闭,根据jvm退出的规则,只要有非daemon线程没有关闭,jvm就不会退出,因此你的tomcat进程仍然运行在。

对其它问题,如果你要在shutdown关闭时也停止你产生的线程,你应该实现contextInitialized(ServletContextEvent sce)方法,并在其中停止你产生的线程。

说白了,就是资源管理的问题,“自己开启的资源得自己释放”
0 请登录后投票
   发表时间:2008-11-06  
退出的时候把jvm退出java.lang.Runtime.this.exit
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics