2010-01-04 53 views
14

我正在構建一個相對簡單的Web應用程序,其中主Servlet實現ServletContextListener接口以確定上下文是已啓動還是停止。我已經實現了我的contextInitialized,contextDestroyed,initdestroy方法(在基類上都有initdestroy調用super)。我目前已經實現了沒有真正的功能,除了我已經在contextInitialized方法中初始化log4j的方法,我加載log4j.properties文件。Tomcat未在Eclipse內關閉

當我在Eclipse中啓動和停止Tomcat服務器時,所有內容都按照正確的順序調用(我使用一些System.out.println來測試),但是在停止服務器約10秒後,用Eclipse彈出窗口說明以下內容:

服務器Tomcat v6.0服務器在本地主機 沒有響應。你想 終止這臺服務器?單擊確定以 終止服務器或單擊取消 繼續等待。

這是什麼印在我的Eclipse控制檯時,我停止服務器:

04/01/2010下午7時39分13秒org.apache.catalina.core.StandardService停止
信息:停止服務卡塔利娜
contextDestroyed
04/01/2010下午7點39分13秒org.apache.coyote.http11.Http11Protocol破壞
信息:在停止狼HTTP/1.1 HTTP-8080

在最後一個INFO消息之後,它只是掛在那裏,直到彈出窗口出現。如果我選擇等待,請按取消,Eclipse變得不可用,我必須從終端中終止Eclipse進程。

有關如何解決此問題的任何輸入將不勝感激。

UPDATE:

這個問題是由我開始我的init方法中的非守護線程引起的(忘了提,:)。該問題已通過使用stop方法明確停止線程來解決,即使該方法似乎已被棄用。

+0

我真能第一人使用標籤 '的servlet'?!? – Luke 2010-01-04 08:48:46

+0

'servlets'是更常見的標籤,看來。 :) – ZoogieZork 2010-01-04 08:59:31

+0

我認爲這不僅發生在日食,但一般。 據我記得這是一個log4j資源的問題,谷歌考慮到這一點。 – Bozho 2010-01-04 10:05:59

回答

5

正如this thread中提到的,這應該與清理問題有關。

如果一個web應用程序沒有完全清理,特別是關於停止非守護程序線程啓動,Tomcat將無法關閉。
單擊「停止」具有提供超時的優點。
如果Tomcat無法在超時內停止,將出現一個對話框,讓您選擇終止服務器或繼續等待。

+0

你的回答很棒。我在解釋解決方案的問題中添加了更新。謝謝! – Luke 2010-01-05 00:32:38

+1

對我來說,即使發生了事情,並且我得到了一個對話框,我點擊強制Tomcat關閉,即使它沒有關閉。所以我仍然在等待Tomcat服務器關閉。我知道我可以直接殺死deamon,但強制關機(在timout之後)也應該關閉服務器。 – user590849 2013-05-30 18:54:44

0

我有類似的行爲。如果關閉Tomcat並不能幫助從控制檯視圖中找到另一個活動控制檯並殺死它。在我的情況下,它有幫助。

+2

這不是我不能殺死/阻止它。我希望它在沒有我通過頭拍攝的情況下正常關機。 – Luke 2010-01-04 11:15:09

0

在Windows上,打開任務管理器並終止進程javaw

0

在Mac OS X上,使用Activity Monitor,強制退出GrailsS​​tarter進程。在Windows

6

打開命令提示符或PowerShell和鍵入

netstat -nao 

找到PID從結果對應的端口並輸入

taskkill /f /pid [port number] 
0

我是看着你的更新,其解決您的問題,也對於這個問題的所有其他觀衆,我想給出更好的方法。

而不是使用停止u應該調用線程中斷和運行方法的包裝代碼 while循環檢查!isInterrupted(),每當中斷被調用線程將退出循環並且run方法將完成其處理。就像從我的另一個answer

class Consumer implements Runnable{ 
    private BlockingQueue<Message> blockingQueue; 
    Consumer(BlockingQueue<Message> blockingQueue){ 
     this.blockingQueue=blockingQueue; 
    } 

    @Override 
    public void run(){ 
     while(!Thread.interrupted()){ 
      System.out.print("Concumer Started"); 
      try{ 
       Message message = blockingQueue.take(); 
       System.out.print("message Id"+message.messageId+" Consumed "); 
      } 
      catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
      System.out.println("Concumer Done"); 
     } 
    } 
} 
1

例子下面的例子:

taskkill /pid 1230 /pid 1241 /pid 1253 
taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe 
taskkill /s srvmain /f /im notepad.exe 
taskkill /s srvmain /u maindom\hiropln /p [email protected] /fi "IMAGENAME eq note*" /im * 
taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im * 
taskkill /f /fi "PID ge 1000" /im * 

請使用鏈接 https://technet.microsoft.com/en-us/library/bb491009.aspx