You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows服务器Tomcat无法完全停止的问题排查与解决

解决Windows服务器Tomcat无法正常停止的问题

问题根源分析

从提供的catalina日志警告信息可明确:Web应用[espaceperso]启动的多个线程未在Tomcat停止时正常终止,这些非守护线程会阻塞Tomcat的销毁流程,导致服务一直卡在“正在停止”状态:

  • File Watcher线程(来自com.documentum.fc.common.DfFileWatcher)
  • 多个SessionDestroyer-XXX线程(来自com.adecco.edoc.core.session.SessionDestroyer)

这些线程处于休眠状态(堆栈显示调用了Thread.sleep),且未实现优雅停止逻辑,Tomcat无法自动终止它们,只能持续等待。

解决步骤

1. 根本修复:优化应用线程的停止逻辑

需修改应用代码,让线程支持优雅停止:

  • 针对SessionDestroyer线程:
    • 将线程设置为守护线程(调用thread.setDaemon(true)),Tomcat停止时会自动终止守护线程
    • 或实现中断响应逻辑:在run()方法中通过Thread.currentThread().isInterrupted()判断是否需要退出,收到中断信号时终止线程
    // 修改后的SessionDestroyer.run()示例
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(xxx); // 保留原休眠时长
                // 原业务逻辑
            } catch (InterruptedException e) {
                // 捕获中断异常,终止线程
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
    
  • 针对DfFileWatcher线程:
    • 检查Documentum相关API是否提供停止文件监听器的方法,在Web应用的ServletContextListener.contextDestroyed()中主动调用停止逻辑
    • 也可将其设置为守护线程

2. 临时应急方案(无需改代码)

如果暂时无法修改应用,可通过以下方式快速终止Tomcat:

  • 命令行强制杀进程:
    1. 打开CMD,执行netstat -ano | findstr "8080"(替换为你的Tomcat端口)获取进程PID
    2. 执行taskkill /F /PID [进程PID]强制终止进程
  • 配置Tomcat超时强制停止:
    在conf/server.xml的Server节点添加shutdownTimeout属性,设置超时时间(单位毫秒),超时后Tomcat会强制退出:
    <Server port="8005" shutdown="SHUTDOWN" shutdownTimeout="10000">
    

3. 验证修复效果

修改后重启Tomcat,尝试正常停止服务,查看catalina日志是否再出现线程未停止的警告,确认服务能正常终止。


内容的提问来源于stack exchange,提问作者pradeep sampathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:42