2011-04-14 39 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