调用shutdown.sh后,Tomcat关闭非常缓慢?

6
我的情况是这样的:
每次在上传war文件到web-app文件夹之前,我都会通过调用“sh shutdown.sh”停止Tomcat。以前总共需要30秒来完成关闭。但现在它不再有效。
实际上,它做了一些工作,因为当我从网页访问应用程序时,它会抛出503错误(正在维护中)。但是当我使用“ps aux | grep tomcat”进行检查时,tomcat进程仍然存在。而且它会存在大约5-10分钟。
我知道可能需要花费额外的时间来完成所有任务,但是它太慢了(5-10分钟),在完全停止之前。我不明白为什么会这样,但肯定有原因。也许与代码有关,或者最近我们使用的新部署脚本有关。我几乎没有任何线索可以检查。
这对我们的团队很重要,因为我们正在使用“自动部署”,其中我们使用脚本自动打包war文件,在特定时间上传和部署。如果我们在旧实例成功关闭之前启动了新的Tomcat实例,它将永远挂起,并且通过“kill -9”清除任务是困难的。
是否有任何人遇到过这个问题?任何线索都将不胜感激。

1
问:当它花费5-10分钟时,日志中的最后一件事情是什么?另外:“ps -eaf”给你任何线索(或者你只看到一个占用零CPU的Java进程)?你的Tomcat版本是多少?你的操作系统是什么?另外:如果您在“ps”中识别到一个“挂起”的“java”进程,应该获取堆栈跟踪:http://wiki.apache.org/tomcat/HowTo#How_do_I_obtain_a_thread_dump_of_my_running_webapp_.3F - paulsm4
@paulsm4:查看日志,我发现即使调用了shutdown.sh,我的Quartz作业仍在运行。过一段时间后会抛出一个错误:SEVERE:Web应用程序[/project]似乎已经启动了一个名为[Resource Destroyer in BasicResourcePool.close()]的线程,但未能停止它。这很可能会导致内存泄漏。 - Hoàng Long
@paulsm4:顺便说一下,我让石英定时任务每次运行大约10秒钟。这会有问题吗? - Hoàng Long
2
请查看这里的答案。https://dev59.com/TlXTa4cB1Zd3GeqP6OoY Tomcat将等待所有非守护线程完成后再关闭。链接中的答案将告诉您如何确定仍在运行什么。 - Sean
2个回答

3

Hoàng Long -

感谢您的更新。

1) 您看到Quartz作业运行和错误消息这两点都很重要:

SEVERE: The web application [/project] appears to have started a thread named [Resource Destroyer in BasicResourcePool.close()] but has failed to stop it. This is very likely to create a memory leak.

2) 一个建议是配置:

http://forum.springsource.org/showthread.php?17833-Spring-Quartz-Tomcat-no-shutdown

我有同样的问题。为了解决它,我在SchedulerFactoryBean定义中添加了destroy-method="destroy"。这样的话,当应用程序停止时,Spring会关闭调度器。

3) 另一个建议是添加一个关机监听器:

http://forums.terracotta.org/forums/posts/list/15/4341.page

Using a context listener and introducing a timeout on shutdown solves the issue for me. I just wait a second after shutting down:

  public void contextDestroyed(ServletContextEvent sce) {
    try {
      factory.getScheduler().shutdown();
      Thread.sleep(1000);

我想我已经弄清楚了:主要原因是我仍然有事务石英作业在运行。关于您答案中的第三种方法,您是指我必须为此任务覆盖Spring的“ContextLoaderListener”吗? - Hoàng Long


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接