zoukankan      html  css  js  c++  java
  • Tomcat执行shutdown方法后无法彻底关闭问题

    对tomcat进行了一些改写,使得tomcat能够响应新的协议请求。

    在改写完毕以后,在eclipse上debug没有任何问题,便将改写后的tomcat打成jar包,替换原本的apache-tomcat-6.0.37目录下lib文件夹内的对应jar包。

    执行startup.sh后一切正常,程序和debug的结果一致。

    但是执行了一次shutdown后再执行一次startup发现无法获取Mapper对象。

    ps -ef发现java进程有好多没有关闭,因此考虑是线程的生命周期没有控制好导致tomcat运行结束后线程依旧没有关闭。

    进入JAVA_HOME目录下bin文件夹,找到命令jstack,jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。

    命令格式:

    jstack [ option ] pid
    jstack [ option ] executable core
    jstack [ option ] [server-id@]remote-hostname-or-IP

    使用jstack打印信息后,发现有两个没有结束的进程,以及由于这些进程导致的其他无法关闭的进程,因此在shutdown命令执行后,无法完全关闭tomcat,导致第二次启动时会出现bug

    定位到这两个进程,发现都是在run()方法中使用了while(true)使得程序无法正确终止,最后在新写入的Protocol类中实现的destroy方法内,将这两个线程的while判断条件做了限制,使得destroy方法执行能够结束这两个进程,问题解决。

  • 相关阅读:
    vue 兼容IE报错解决方案
    JDK1.8 ArrayList 源码解析
    Mac nasm 汇编入门
    命令模式
    模板方法
    Mysql Limit 调优
    观察者模式
    外观模式
    Rest- Client
    MongoDB数据库 5分钟快速上手
  • 原文地址:https://www.cnblogs.com/xiaoxiaff/p/3949951.html
Copyright © 2011-2022 走看看