tomcat启动后卡死

本文记录了一次在测试机上启动多个Tomcat实例时遇到的死锁问题。通过使用jstack工具,发现主进程与定时任务在调用Springframework的getBean方法时发生了死锁。文中分享了排查及定位问题的过程。

这是一台机器上启动多个tomcat遇到的问题。程序在开发机上用jetty跑没有问题。但是部署到测试机上却出问题了。而且时而正常,时而卡住。非常诡异。

看日志,一直卡在
Initializing Spring root WebApplicationContext
后面就没有日志了。

将Spring开启debug日志级别,catch可能的exception,统统没用。在网上能查到的说法都是可能某个线程连接数据库卡住了(要么是数据库地址配置不对,要么是数据库服务器暂时不可用),但是都不符合我的情况。

后来用了一个超好用的工具jstack,直接打印出堆栈情况。注意要用启动tomcat的用户执行这个命令,例如我用user_00启动tomcat,用root执行jstack都没法得到正确输出。

然后发现问题所在,main线程和另一个定时任务死锁了,他们都调用了Spring framework的getBean方法。具体还没有仔细分析。

所以如果再遇到卡住的问题,可以试试jstack。

为了实现在 Windows 环境下自动检测并重启无响应的 Tomcat 进程,可以通过编写一个批处理脚本(.bat)结合任务计划程序来实现定时监控和重启操作。 ### 实现思路 1. **检测 Tomcat 是否无响应**: - 使用 `netstat` 检查 8080 端口是否在监听。 - 或者通过访问本地页面(如 `http://localhost:8080`)判断是否能正常返回 HTTP 响应。 - 若检测失败,则认为服务无响应。 2. **终止卡死Tomcat 进程**: - 使用 `taskkill` 命令根据进程 ID 终止旧的 Tomcat 进程。 3. **启动 Tomcat 服务**: - 调用 `startup.bat` 启动 Tomcat。 4. **日志记录与通知**(可选): - 可将每次重启的时间、原因等写入日志文件。 - 也可以通过邮件或消息推送通知管理员。 --- ### 示例脚本:tomcat_monitor.bat ```batch @echo off setlocal :: 设置Tomcat目录 set TOMCAT_HOME=C:\apache-tomcat-9.0.56 set LOG_FILE=%TOMCAT_HOME%\logs\tomcat_monitor.log :: 日志时间戳 set LOG_TIME=%date% %time% :: 检查8080端口是否被占用 netstat -ano | findstr :8080 >nul if errorlevel 1 ( echo [%LOG_TIME%] Tomcat未运行,准备启动... >> %LOG_FILE% goto start_tomcat ) :: 获取当前PID for /f "tokens=5" %%a in ('netstat -ano ^| findstr :8080') do set PID=%%a :: 尝试访问本地页面测试响应 curl -s http://localhost:8080 | findstr "Apache Tomcat" >nul if errorlevel 1 ( echo [%LOG_TIME%] Tomcat无响应,正在终止进程 %PID%... >> %LOG_FILE% taskkill /F /PID %PID% ) :start_tomcat echo [%LOG_TIME%] 正在启动Tomcat... >> %LOG_FILE% call "%TOMCAT_HOME%\bin\startup.bat" ``` --- ### 配置任务计划程序 1. 打开“任务计划程序”。 2. 创建基本任务: - 触发器:每天/每小时/每几分钟执行一次。 - 操作:启动程序 → 选择上述 `.bat` 文件。 3. 完成设置后保存。 --- ### 注意事项 - 确保系统已安装 `curl` 工具,或者使用其他方式模拟 HTTP 请求。 - 如果 Tomcat 是作为服务运行,请改用 `sc stop/start` 控制服务。 - 若项目依赖数据库或其他资源,在重启前确保外部依赖可用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值