我是新的Java世界,也是tomcat世界的新寵。所以,問題是:如何將tomcat設置爲守護進程?
我需要運行一個Java類作爲一個守護進程。這個類應該能夠與tomcat請求通信。
過去:我做這在C的時候,我執行的二進制文件作爲後臺進程。
你能給我一些建議如何繼續?
感謝ind advance !.
我是新的Java世界,也是tomcat世界的新寵。所以,問題是:如何將tomcat設置爲守護進程?
我需要運行一個Java類作爲一個守護進程。這個類應該能夠與tomcat請求通信。
過去:我做這在C的時候,我執行的二進制文件作爲後臺進程。
你能給我一些建議如何繼續?
感謝ind advance !.
所以聽起來好像有兩個部分的答案。第一個是確保你的守護進程啓動了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>
,這應該是。
我想你想一個ServletContextListener
,這將在servlet上下文啓動和關閉被調用。您可以從那裏啓動和停止守護程序線程。
謝謝stevevls,我明白你的意思。但是,我如何對tomcat說:「嘿,X類是一個守護進程,只要你開始,啓動它」? – subzero
@subzero好的...我重寫了我的答案。希望有所幫助。 – stevevls