浅谈windows下,shutdown.bat无法关闭tomcat服务器

本文探讨了在Windows环境中,使用shutdown.bat无法关闭Tomcat服务器的两个常见原因:代码逻辑错误和线程堵塞。解决方案包括检查并修复代码逻辑,设置Servlet监听器以确保线程正确关闭,以及将Tomcat转换为服务进行强制关闭。提醒读者注意暴力关闭可能带来的潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因一:代码逻辑问题

解决方案:
如果出现该博客描述的问题,首先查看代码是否开了线程,而忘记回收资源,其次在看看使用的框架是否使用了连接池、线程池之类的东东,有就在恰当的时候,回收。当然,每个人都觉得自己的代码,无懈可击,完全没有必要修改,所有该方法并不适用所有人。

原因二:线程堵塞,或JDBC

解决方案:
如果出现线程堵塞,tomcat日志中会很明显的抛出严重警告,遇到这种问题,而归根结底造成这种情况,说白了也就是,原因“一”的后遗症,因为你某个地方开启了线程,或者打开连接池,然而在shutdown的时候,该批处理文件,并没关闭java后台线程,造成关闭不了tomcat的现象。
基于这种BUG:假设你使用了Servlet,那么设置监听器,显得尤其重要。什么!监听是什么?请读者自行搜索。
代码如下:
使用要点:
若是你使用的JDBC驱动,并注册了驱动,那么你需要destroySpecifyThreads
若是你开了线程,而你不知道该在哪里销毁它,那么你只需在该变量MANUAL_DESTROY_THREAD_IDENTIFIERS 中COPY日志中的未关闭,或造成堵塞线程的名字就OK了。

/*
 * 监听器:程序退出,关闭所有线程
 */
public class ServletIndexListener implements ServletContextListener{

     public static final List<String> MANUAL_DESTROY_THREAD_IDENTIFIERS = Arrays.asList("Abandoned connection cleanup thread", "pool-1-thread-1" 
             , "AdminTaskTimer" , "HelperThread-#0" , "HelperThread-#1" , "HelperThread-#2" , "pool-1-thread-2"); 
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        destroyJDBCDrivers(); //销毁JDBC
        destroySpecifyThreads(); //销毁Thread
    }

    //开启tomcat前执行线程
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
    }


    //销毁指定线程
    @SuppressWarnings("deprecation")
    private void destroySpecifyThreads() {  
        final Set<Thread> threads = Thread.getAllStackTraces().keySet();  
        for (Thread thread : threads) {  
            if (needManualDestroy(thread)) {  
                synchronized (this) {  
                    try {  
                        thread.stop(); 
//                        System.out.println("线程销毁 成功!");
                    } catch (Exception e) {  
                    }  
                }  
            }  
        }  
    }

    //输入线程关键字
    private boolean needManualDestroy(Thread thread) {  
        final String threadName = thread.getName();  
        for (String manualDestroyThreadIdentifier : MANUAL_DESTROY_THREAD_IDENTIFIERS) {  
            if (threadName.contains(manualDestroyThreadIdentifier)) {  
                return true;  
            }  
        }  
        return false;  
    }

    //这里是反注册驱动
    private void destroyJDBCDrivers() {  
        final Enumeration<Driver> drivers = DriverManager.getDrivers();  
        Driver driver;  
        while (drivers.hasMoreElements()) {  
            driver = drivers.nextElement();  
            try {  
                DriverManager.deregisterDriver(driver);  
            } catch (SQLException e) {  
            }  
        }  
    }
}

重点内容

终极办法:

咳咳,当读者看到这里的时候,说明前面笔者说的都是废话,完成没有用!
那么,现在笔者就教给大家一个符合暴力美学的方法。这种方法,杀人不见血!慎用!
该办法,就是安装tomcat/bin目录下的service.bat文件,让tomcat服务器变成计算机服务,在DOS下输入命令行开启和关闭,这办法很强势,像打家劫舍的土匪,管你有的没的,一股脑就给你关闭了。
当然,这种方案很多前辈都说过了,笔者只是站在巨人们的肩膀上而已……
最后,具体怎么安装,请读者自行搜索!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值