2011-07-27 69 views
1

我是新的Java世界,也是tomcat世界的新寵。所以,問題是:如何將tomcat設置爲守護進程?

我需要運行一個Java類作爲一個守護進程。這個類應該能夠與tomcat請求通信。

過去:我做這在C的時候,我執行的二進制文件作爲後臺進程。

你能給我一些建議如何繼續?

感謝ind advance !.

回答

3

所以聽起來好像有兩個部分的答案。第一個是確保你的守護進程啓動了tomcat容器,另一個是確保你的線程得到了正確的配置,以便在關閉後不保持tomcat實例的活動狀態。

由於有關線程的部分是簡單的,我會說出來的第一方式。你產生的所有線程應該是守護線程(例如,你叫Thread.setDaemon(true))。從O'reilly's Exploring Java's Chapter on Threads報價:

在很多情況下,我們真正想要的是創建後臺線程 在應用程序中做簡單的,週期性的任務。 setDaemon() 方法可用於將線程標記爲守護進程線程,應該在 死亡並在沒有其他應用程序線程保留時丟棄。 通常,Java解釋器繼續運行,直到所有線程完成 。但是當守護進程線程仍然活着時,解釋器將退出。

有活的非守護線程將阻止tomcat的乾淨關閉。原因在於tomcat保持一個非守護進程線程運行直到它收到關閉消息,此時所述線程停止。如果還有其他的非守護進程線程,那麼JVM會很樂意繼續玩,並且你必須從命令行中終止進程。

而現在我們終於趕在掛接到servlet容器的生命週期,以產卵我們的服務。這裏有兩個步驟......我們必須按Jim Garrison的建議實施ServletContextListener,然後我們必須告訴容器加載它。這裏有兩件事情:

第1步:實現ServletContextListener

public class MyDaemonServletContextListener implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent sce) { 

     Thread th = new Thread() { 
      public void run() { 
       // implement daemon logic here. 
      } 
     }; 
     th.setDaemon(true); 
     th.start(); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     // you could notify your thread you're shutting down if 
     // you need it to clean up after itself 
    } 
} 

步驟2:聲明它在你的web.xml

<listener> 
    <listener-class>MyDaemonServletContextListener</listener-class> 
</listener> 

,這應該是。

+0

謝謝stevevls,我明白你的意思。但是,我如何對tomcat說:「嘿,X類是一個守護進程,只要你開始,啓動它」? – subzero

+0

@subzero好的...我重寫了我的答案。希望有所幫助。 – stevevls

1

我想你想一個ServletContextListener,這將在servlet上下文啓動和關閉被調用。您可以從那裏啓動和停止守護程序線程。