关于tomcat无法shutdown的问题:
这个主要是由于tomcat应用服务中有非daemon线程没有关闭。而根据jvm退出规则,只要有非daemon线程存在,jvm就不会退出
。
在我们的PerLogTask
使用Timer.schedule
周期性执行任务,里面派了出了线程,这些线程属于PerLogTask的“资源”,也只能由PerLogTask去释放
。而tomcat在shutdown时,它会回收了PerLogTask本身“资源”,却不会去回收PerLogTask申请的“资源”,造成有“资源”没有释放,jvm就不会退出。所以在tomcat回收PerLogTask“资源”时,也应该通知PerLogTask回收它自己申请的“资源”。
解决方法:
1、注释掉
perfLogTimer。不用这个组件,同时检查是否还有这种定时程序里分配了线程。
2、把perfLogTimer移动到biz-context-core.xml里,由spring管理。(core-context.xml这个文件不是由spring管理的
)
增加一个属性"destroy-method"
<bean id="perfLogTimer"
class="com.paipai.logicframework.common.perstat.PerLogTask"
init-method="init" destroy-method="clear"
>
因此要升级类com.paipai.logicframework.common.perstat.PerLogTask,增加了clear方法。
对于用com.paipai.logicframework-3.0.1.jar的,可以从持续集成获取,已经升级。对于3.0.1版本之前的。替换掉com.paipai.logicframework.common.perstat.PerLogTask类
。见附近里。
同时说明一下:tomcat里应用服务里有线程相关的,一定要释放这些线程,按“谁申请谁释放”原则处理。
拍拍API
项目运行在Tomcat
等容器中时,
容器未能正常关闭,
比如在Tomcat
启动后,
未能通过使用shutdwon.sh
命令关闭Tomcat,
造成这个问题的主要原因是:
容器在软关闭时,
检查到容器中还有其他由容器创建的服务尚在运行,
此时容器只有等待所有的服务都结束后,
才会去真正关闭容器.
而我们的API
项目中,
有个Spring
的bean
服务(com.paipai.logicframework.common.perstat.PerLogTask)
在容器启动时创建了定时器,
该定时器需要由Spring
容器去维护其生命周期(
启动/
运行/
结束),
而在我们的Spring
配置文件中只定义了该服务Bena
的启动方法,
没有去配置其结束的方法,
这就导致在Tomcat
软关闭时,
没有结束该定时器的任务,
因此Tomcat
一直处于等待关闭的状态.
Spring
的配置文件如下:
core-context.xml
<!--=====================================================================-->
<!--
定义性能统计日志记录器-->
<!--=====================================================================-->
<bean id="perfLogTimer"
class="com.paipai.logicframework.common.perstat.PerLogTask" init-method="init"
destroy-method="clear"
>
<description>
性能统计日志的定时记录器</description>
<property
name="delayTime">
<description>
任务初始化延迟的时间,以秒为单位</description>
<value>60</value>
</property>
</bena>
在服务容器中,
对于具有生命周期的服务(
比如定时器/
具有阻塞方法的服务/
异步通讯的服务),
容器都应该主动去管理好这些服务的生命周期,
便于整个容器的启动/
关闭和运行维护.
分享到:
相关推荐
tomcat shutdown后,进程还存在linux系统中的解决办法
在使用Apache Tomcat服务器时,有时可能会遇到一个棘手的问题:当你尝试通过`shutdown.bat`脚本关闭一个Tomcat实例时,它意外地关闭了同一台机器上的其他Tomcat实例。这个问题主要是由于Tomcat的批处理脚本如何查找...
5. **权限问题**:如果Tomcat无法写入工作目录或日志目录,可能是因为文件权限不足。确保Tomcat运行用户对相关目录有读写权限。 6. **应用错误**:如果问题出在部署的应用上,比如Web应用的类加载问题或者Servlet...
本篇文章将深入探讨如何实现"Tomcat自动定时重启"这一功能,以及提供的两个批处理文件——`Tomcat_startup.bat`和`Tomcat_shutdown.bat`的作用。 首先,`Tomcat_startup.bat`和`Tomcat_shutdown.bat`是Tomcat服务器...
- 停止Tomcat则使用`bin/shutdown.sh`或`shutdown.bat`。 3. **配置文件详解**: - `server.xml`:这是Tomcat的主要配置文件,包含了服务器端口、Context、Connector等设置。 - `web.xml`:每个Web应用都有一个...
重启命令通常在Tomcat的bin目录下执行`shutdown.sh`(Linux/Mac)或`shutdown.bat`(Windows)停止服务,然后执行`startup.sh`或`startup.bat`启动服务。 然而,仅仅修改控制台的编码可能还不够,因为Web应用的其他...
- `bin`:包含Tomcat的可执行文件和脚本,如startup.sh/startup.bat用于启动Tomcat,shutdown.sh/shutdown.bat用于关闭Tomcat。 - `conf`:存放所有配置文件,如server.xml、web.xml、context.xml等。 - `lib`:存储...
2. **启动与停止**:使用bin目录下的startup.sh(Unix/Linux)或startup.bat(Windows)脚本来启动Tomcat,shutdown.sh或shutdown.bat则用于关闭服务。 3. **部署应用**:应用程序通常以WAR(Web ARchive)文件的...
在 Linux 系统下,Tomcat 的重新启动是一个常见的问题,很多开发者和运维人员都会遇到这种情况。那么,如何在 Linux 系统下重新启动 Tomcat 呢?下面,我们将详细讲解 Tomcat 的重新启动过程。 首先,我们需要了解 ...
1. **bin目录**:包含了启动和停止Tomcat的脚本,如`startup.sh`和`shutdown.sh`,以及用于管理应用的工具,如`catalina.sh`和`manager.sh`。 2. **conf目录**:包含Tomcat的主要配置文件,如`server.xml`(定义...
2. **启动与停止**:通过`bin/startup.sh`(Linux/Unix)或`bin/startup.bat`(Windows)脚本启动Tomcat,使用`bin/shutdown.sh`或`bin/shutdown.bat`关闭服务。 3. **配置文件**:主要的配置文件包括`conf/server....
8. **管理服务**:可以通过`shutdown.sh` 停止Tomcat,或者你可以配置Tomcat作为系统服务,使其在系统启动时自动启动。 9. **安全与优化**:为了提高安全性,应配置Tomcat的`server.xml`文件,例如限制连接器的端口...
3. **启动和停止**:使用bin目录下的startup.bat/sh脚本启动Tomcat,使用shutdown.bat/sh脚本停止Tomcat。也可以通过管理工具如catalina.sh或catalina.bat进行更复杂的管理操作。 4. **Web应用程序部署**:将Web...
3. 启动与停止:使用`bin/startup.sh`(Unix/Linux)或`bin/startup.bat`(Windows)启动Tomcat,`bin/shutdown.sh`或`bin/shutdown.bat`则用于关闭服务器。 4. 配置与管理:通过修改`conf/server.xml`配置文件,...
通过bin目录下的startup.bat或startup.sh脚本可以启动Tomcat服务,shutdown.bat或shutdown.sh用于关闭服务。 3. **应用程序部署**:Tomcat支持WAR格式的Web应用部署,只需将WAR文件放入webapps目录下,Tomcat会自动...
描述中提到的"tomcat部署web项目"是关于如何在Tomcat服务器上发布和运行web应用的过程。这通常涉及以下几个步骤: 1. **安装Tomcat**:解压下载的"tomcat-7.0.108.zip"到指定目录,确保服务器有足够的权限运行其可...
ExecStop=/usr/local/tomcat/apache-tomcat-8.5.47/bin/shutdown.sh User=root Restart=always [Install] WantedBy=multi-user.target ``` 3. **保存并关闭文件**,然后更新systemd的缓存,并启用Tomcat服务...
4. 使用`bin/startup.sh`启动Tomcat,`bin/shutdown.sh`关闭Tomcat。 5. 配置防火墙或者SELinux,允许必要的端口(默认为8080)通过。 6. 测试Tomcat是否正常工作,访问`http://your_server_ip:8080`,如果能看到...