2012-07-05 30 views
5

我的情況是這樣的:Tomcat關機調用shutdown.sh後很慢?

每次將war文件上傳到web-app文件夾,我都會通過調用sh shutdown.sh來停止Tomcat。過去總共需要約30秒的關機時間。但現在它不再適用了。

其實,它做了一些工作,因爲當我從網頁訪問應用程序時,它會拋出503錯誤(維護下)。但是當我使用ps aux | grep tomcat進行檢查時,tomcat進程仍然存在。它將在那裏約5-10分鐘。

據我所知,可能需要額外的時間來完成所有任務,但在完全停止之前它太慢了(5-10分鐘)。我不明白爲什麼會發生這種情況,但必須有一些原因。也許這與代碼或最近使用的新部署腳本有關。我幾乎不知道在哪裏檢查。

這對我們的團隊很重要,因爲我們使用的是「自動部署」,我們使用腳本來自動打包戰爭文件,在特定時間上傳和部署。如果我們在舊的成功關閉之前啓動了一個新的tomcat實例,它將會永久掛起,並且通過「kill -9」清理任務令人望而生畏。

有沒有人試驗過這個問題?任何線索將不勝感激。

+1

問:那麼當它採取這一5-10分鐘,什麼是過去的事情在日誌中?另外:「ps -eaf」是否提供了任何線索(或者您是否看到一個CPU進程利用率爲零的Java進程)?什麼是您的Tomcat版本?你的OS?另外:如果你在「ps」中確定一個「java」進程「懸掛」,你應該得到一個堆棧跟蹤:http://wiki.apache.org/tomcat/HowTo#How_do_I_obtain_a_thread_dump_of_my_running_webapp_.3F – paulsm4

+0

@ paulsm4:看着日誌,我發現即使在調用shutdown.sh之後,我的Quartz作業仍然運行。過了一會兒,錯誤被拋出:SEVERE:Web應用程序[/ project]似乎已經啓動了一個名爲[ResourceRestroyer in BasicResourcePool.close()]的線程,但未能阻止它。這很可能造成內存泄漏。 –

+0

@ paulsm4:順便說一下,我有一次約10秒的石英工作。這可能是一個問題嗎? –

回答

2

HoàngLong -

謝謝您的更新。

1),你看到你的Quartz作業運行的事實,並且錯誤信息,均爲顯著:

重度:Web應用程序[/項目]似乎已經開始了一個 線程名爲[資源驅動程序在BasicResourcePool.close()]但有 未能阻止它。這很可能造成內存泄漏。

2)的一個建議是配置:

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

我有同樣的問題。我通過將 destroy-method="destroy"添加到SchedulerFactoryBean定義來修復它。 這種方式在應用程序停止時關閉調度程序 。

3)另一項建議是增加一個關機聽衆:

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

使用上下文監聽器,並在關機引入超時解決 這個問題對我來說。我只是等待第二關停後:

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

我想我已經想通了:主要原因是我仍然有事務石英作業運行。關於你的答案的第三種方法,你的意思是我必須爲這個任務重寫Spring「ContextLoaderListener」嗎? –