2011-04-14 38 views
0

永久servlet在服務器啓動時加載,直到服務器關機爲止。如何在Tomcat 6中配置永久Servlet?

我有要求啓動一些服務器端java程序,然後這些程序提供的功能是完全獨特的和獨立於Web服務器。我希望在Tomcat啓動時執行此操作。我看到的解決方案是Permanent Servlet,它將調用這些Java程序。

那麼如何在Tomcat 6中配置Permanent Servlets?有關永久Servlet的

更多細節從http://java.sun.com/developer/onlineTraining/Servlets/Fundamentals/servlets.html

臨時與永久的Servlet

的Servlet可以啓動和停止爲每個客戶端的請求,也可以作爲Web服務器啓動和啓動在服務器關閉之前保持活動狀態。臨時servlet按需加載,並提供了一種很好的方法來節省服務器中的資源以減少使用的功能。

永久servlet在服務器啓動時加載,直到服務器關閉爲止。當服務器的啓動成本非常高時(例如與DBMS建立連接),提供服務器端永久性功能(如RMI服務),或者他們必須響應時,Servlet將作爲服務器的永久擴展來安裝儘可能快地滿足客戶的要求。

沒有特殊的代碼來使servlet成爲臨時或永久的;這是服務器配置的功能。

由於servlet可以在Web服務器啓動時加載,因此可以使用此自動加載機制來提供更容易加載的服務器端Java程序。這些程序可以提供完全獨一無二的功能,並且獨立於Web服務器。例如,servlet可以通過TCP/IP端口提供基於R的服務(rlogin,rsh,...),同時使用servlet請求/響應協議來呈現和處理用於管理servlet的HTML頁面。

回答

4

你可以用ServletContextListener做你所需要的。註冊一個在你的web.xml,如:

<listener> 
    <listener-class>com.example.MyServletContextListener</listener-class> 
</listener> 

然後創建一個類你想要做什麼:

public class MyServletContextListener implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent sce) { 
     // initialize and startup whatever you need here 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     // shutdown and destroy those things here 
    } 
} 
+0

這看起來像Permanent Servlet的不錯選擇。但我的問題是如何配置Permanent Servlet? – YoK 2011-04-14 06:43:05

+1

夠公平,好問題。我見過的所有東西都說永久性的servlet是一個配置問題,但是我從未見過如何配置它。我知道的最近的是'web.xml'中的元素。儘管我仍然傾向於使用'ServletContextListener',因爲它是爲你需要的。 – WhiteFang34 2011-04-14 07:07:37

+0

我有這種感覺(但不幸的是沒有證據),默認情況下,servlets是永久的。但是,出於興趣,如果您需要啓動這些servlet來提供「完全獨立於Web服務器的功能」,這聽起來像他們不依賴於請求響應範例。在這種情況下,爲什麼不從上下文監聽器啓動一個或多個線程 - 沒有實現作爲servlet的功能。 – DaveH 2011-04-14 07:42:00

1

我想他們指的是,當他們說什麼「永久的servlet」僅僅是小服務程序你在web.xml中,一拉定義,

<servlet> 
    <description>I'm permanent</description> 
    <display-name>Servlet</display-name> 
    <servlet-name>Servlet</servlet-name> 
    <servlet-class>com.servlet.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

這個servlet將啓動服務器啓動時,直到它關閉將圍繞保持,可能(見下文)。

一個示例臨時servlet將是一個.jsp文件。它不會加載文件直到它被請求,並且它可能會在處理請求後處理它。

望着Servlet Specification約servlet的生命週期,

當servlet引擎啓動時,需要servlet類必須由 servlet容器定位。 servlet容器使用普通的Java類 加載設施加載servlet類。 ... 加載Servlet類後,容器將其實例化以供使用。

然後對於EOL,

servlet容器不需要保持裝入任何特定 一段時間的servlet。在Servlet容器的生命週期(可能爲 天數,月數或年數)或其間的任何時間段內,servlet實例可能會保持活動狀態,時間爲毫秒,時長爲 。 當servlet容器確定應該從 服務中刪除servlet時,它會調用Servlet接口的destroy方法,以允許servlet釋放其正在使用的任何資源並保存任何持久狀態。例如, 容器可能會在想要節省內存資源時或在關閉時關閉 。 在servlet容器調用destroy方法之前,它必須允許 當前在servlet的服務方法中運行的任何線程完成執行,或者 超過服務器定義的時間限制。 在servlet實例上調用destroy方法後,容器可能不會將其他請求路由到該servlet實例。如果容器需要再次啓用 servlet,則必須使用servlet類的新實例來完成此操作。 destroy方法完成後,servlet容器必須釋放servlet 實例,以便它符合垃圾回收的條件。

所以我覺得底線,Servlet規範不保證爲一個servlet需要多長時間保存,它是特定的實現,但我認爲它是一個非常安全的賭注,如果你加載它在啓動時它將在服務器運行的整個過程中保持加載狀態。

對於您的具體使用情況,請遵循WhiteFang34,因爲使用servlet來處理除請求之外的其他內容會濫用API IMO。


[編輯]我到處看看,看看一個servlet的生命週期的管理方式似乎是說,它仍將是web應用生命週期的全部加載。

Servlets

What is the difference between JSF, Servlet and JSP?

java servlet instantiation and session variables

但無處我可以找到說的引用,所以我不知道某些。

+0

根據您最近的評論,閱讀從1.0到3.0的所有servlet版本的Servlet API規範。另外請注意,可憐的OP在他的問題中鏈接的文章寫在1998年。 – BalusC 2011-04-19 23:44:24

+0

@BalusC我只是推翻了這個東西,我讀了我認爲相關的部分,並且我找不到任何說servlet會在容器的整個使用壽命期間保存,只是它可以保存很長時間。你能告訴我它在哪裏概述了嗎? – Andrew 2011-04-20 14:35:21