当前做多个系统的集成部署,目前是在本地的虚拟机上做实验,有一个问题就是:
使用toomcat部署war包,启动正常,关闭tomcat的时候直接报错了:
上网查了一下,大概原因可能是 因为java程序里面用了线程池的代码 导致系统不能马上关闭
然后再试了一下shutdown.sh命令就成功了 不过还是报了一个错
搜了一下网上的答案 大概就是更改catalina.sh的代码
在异常判断的时候直接 kill -force
可能是环境还是版本的不同我这边是没有找到对应的代码
强行加了一个 -forece后 也是报错了 脚本都中断 了
所以就在catalina.sh的脚本里自己加了一段" kill -9"
然后就是这种情况了:
最后总结
不作任何修改的话第一次关闭(./shutdown.sh
)会报错,报错信息:tomcat.pid这个文件没有删除,再执行一次./shutdown.sh
会成功 不过报错信息一大片 大概就是命令执行失败,强行关闭了进程,这时候去看进程的文件也被删除了.
请问大家有什么好的方案
优雅的关闭tomcat
“优雅的关闭tomcat”……默认的关闭脚本(不加force的),就已经是优雅的方案了,Tomcat 可以收到
ShutdownHook
,然后依次调用各个WebApp的ServletContextListener.contextDestroyed
,比如你的Spring -> ServletContextListener
,然后关闭 Spring Context,Spring 再 destroy 各个 Bean,比如你的连接池,你的连接池收到 destroy 后再依次关闭各个连接,多么优雅tomcat 默认的关闭超时是 5秒,你的程序在5秒内没有成功关闭,所以你还是应该从代码下手,找找为什么关不了的原因,强制关闭当然会有报错
可能的原因有:
而且,“优雅关闭”一般指的是平滑关闭,及不强制中断已有代码,比如在网络请求中,等待所有请求完成才关闭。并不是说关闭不报错就算优雅关闭了