【问题标题】:Tomcat shutdown VERY slow after calling shutdown.sh?调用shutdown.sh后Tomcat关闭非常慢?
【发布时间】:2012-07-05 11:13:36
【问题描述】:

我的情况是这样的:

每次上传war文件到web-app文件夹之前,我都会调用sh shutdown.sh来停止Tomcat。过去,完全关机大约需要 30 秒。但是现在已经不行了。

实际上,它做了一些工作,因为当我从网页访问应用程序时,它会抛出 503 错误(维护中)。但是当我使用ps aux | grep tomcat查看时,tomcat进程还在。它会在那里大约 5 - 10 分钟。

我知道完成所有任务可能需要额外的时间,但是在完全停止之前它太慢了(5 - 10 分钟)。我不明白为什么会发生这种情况,但一定有一些原因。也许与代码或我们最近使用的新部署脚本有关。我几乎不知道在哪里检查。

这对我们的团队很重要,因为我们正在使用“自动部署”,其中我们使用脚本自动打包 war 文件,在特定时间上传和部署。如果我们在旧的tomcat实例成功关闭之前启动了一个新的tomcat实例,它将永远挂在那里,并且通过“kill -9”清理任务是令人生畏的。

有没有人尝试过这个问题?任何线索将不胜感激。

【问题讨论】:

  • 问:那么在这 5 到 10 分钟内,日志中的最后一件事是什么?另外:“ps -eaf”是否为您提供任何线索(或者您是否只看到 CPU 利用率为零的 Java 进程)?你的 Tomcat 版本是多少?你的操作系统?另外:如果你在“ps”中识别出一个“java”进程“挂起”,你应该得到一个堆栈跟踪:wiki.apache.org/tomcat/…
  • @paulsm4:查看日志,我发现即使调用了shutdown.sh,我的Quartz 作业仍然运行。过了一会儿,抛出一个错误:严重:Web 应用程序 [/project] 似乎已经启动了一个名为 [Resource Destroyer in BasicResourcePool.close()] 的线程,但未能停止它。这很可能会造成内存泄漏。
  • @paulsm4:顺便说一下,我让石英作业一次运行大约 10 秒。这可能是个问题吗?
  • 看看这里的答案。 stackoverflow.com/questions/5554647/… Tomcat 将等待所有非守护线程完成后再关闭。链接中的答案将告诉您如何确定仍在运行的内容
  • @Sean:谢谢。我去看看。

标签: java linux apache tomcat tomcat6


【解决方案1】:
【解决方案2】:

黄龙-

感谢您的更新。

1) 您看到 Quartz 作业正在运行这一事实以及错误消息都很重要:

严重:Web 应用程序 [/project] 似乎已启动 线程名为 [BasicResourcePool.close() 中的资源销毁器] 但具有 未能阻止它。这很可能会造成内存泄漏。

2) 一个建议是配置:

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

我遇到了同样的问题。我通过添加来修复它 destroy-method="destroy" 到 SchedulerFactoryBean 定义。 这样,当应用程序运行时,sp​​ring 会关闭调度程序 停止了。

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

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

使用上下文侦听器并在关闭时引入超时解决了 我的问题。我只是在关机后等待一秒钟:

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

【讨论】:

  • 我想我已经弄清楚了:主要原因是我仍在运行事务石英作业。关于您回答的第三种方法,您的意思是我必须为此任务覆盖 Spring "ContextLoaderListener" 吗?
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多