Grails:Tomcat不会在生产中干净地关闭

问题描述 投票:4回答:2

我在生产中关闭Grails应用程序时遇到问题。

从IntelliJ运行时它会干净地关闭。 但是在一个独立的Tomcat 7上,关闭会让它进入一个僵尸状态,其中java进程仍然存在,但HTTP请求挂起。 我必须杀死java进程(使用kill)。

我正在使用Tomcat的标准bin / startup.sh和shutdown.sh。 在Tomcat停止后,我将.war放入Tomcat的/ webapps目录然后启动。

我怀疑它可能是Quartz作业调度程序插件,但是我在grails-app / jobs中部署了一个没有作业的版本,它仍然挂起。

以前有人碰过这个吗? 谢谢!

tomcat deployment grails quartz-scheduler
2个回答
9
投票

非守护进程线程

可能一个或多个非守护程序线程仍在运行,并阻止tomcat成功关闭。

  • 打开终端并键入ps -ef| grep java ps -ef| grep java并找到你的Tomcat7 p_id
  • 输入kill -3 p_id
  • type(在你的Tomcat目录中) tail -200 logs/catalina.out
  • 检查kill -3生成的线程转储
  • 寻找非守护进程线程
  • 检查您的代码以确定该进程仍然存活的原因。

3
投票

我同意KeremBaydoğan。 可能有一个非守护程序线程不想停止。 线程转储是一种很好的方法来跟踪它。

我建议使用VisualVM连接到远程JVM。 这对我来说是一个非常宝贵的工具,可以收集有关我正在运行的应用程序的信息。 如果您使用的是Mac,它已经作为操作系统的一部分安装。 从终端输入'jvisualvm'。 如果没有在Mac上,可以从http://visualvm.java.net/免费下载

安装后,您可能需要添加一些JVM args以允许远程连接。 http://visualvm.java.net/jmx_connections.html

截图: Visual VM线程转储

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.