调用shutdown.sh后Tomcat关机非常慢?

时间:2012-07-05 04:04:56

标签: java linux apache tomcat tomcat6

我的情况是这样的:

每次将war文件上传到web-app文件夹之前,我都会通过调用sh shutdown.sh来停止Tomcat。过去大约需要30秒才能完全停机。但现在它不再适用了。

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

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

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

有没有人尝试过这个问题?任何线索都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

HoàngLong -

感谢您的更新。

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

  

严重:网络应用程序[/ project]似乎已经启动了   名为[Basic Destroyer in BasicResourcePool.close()]但有的线程   未能阻止它。这很可能会造成内存泄漏。

2)一个建议是配置:

  

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

     

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

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

  

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

     

使用上下文侦听器并在关闭解决时引入超时   这个问题对我而言。关机后我才等一下:

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

答案 1 :(得分:2)