在服务器启动时加载永久servlet,并在服务器运行之前一直运行 关机。
我需要启动一些服务器端java程序,然后这些程序提供完全独特且独立于Web服务器的功能。我希望在Tomcat启动时这样做。我看到的解决方案是Permanent Servlet,它将调用这些Java程序。
那么如何在Tomcat 6中配置Permanent Servlet?
有关来自http://java.sun.com/developer/onlineTraining/Servlets/Fundamentals/servlets.html
的永久Servlet的更多详细信息临时与永久Servlet
可以为每个客户端请求启动和停止Servlet,也可以在Web服务器启动时启动它们,并在服务器关闭之前保持活动状态。临时servlet按需加载,并提供了一种很好的方法来节省服务器中资源以用于较少使用的功能。
永久servlet在服务器启动时加载,并在服务器关闭之前一直存在。 Servlet作为服务器的永久扩展安装,当它们的启动成本非常高时(例如与DBMS建立连接),当它们提供永久的服务器端功能(例如RMI服务)时,或者它们必须响应时尽可能快地对客户请求。
没有特殊的代码可以使servlet成为临时或永久的;这是服务器配置的功能。
由于可以在Web服务器启动时加载servlet,因此可以使用此自动加载机制来更轻松地加载服务器端Java程序。然后,这些程序可以提供完全独特且独立于Web服务器的功能。例如,servlet可以通过TCP / IP端口提供基于R的服务(rlogin,rsh,...),同时使用servlet请求/响应协议来呈现和处理用于管理servlet的HTML页面。
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
我认为他们所说的“永久servlet”只是你在web.xml中定义的servlet,la,
<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生命周期的Servlet Specification,
当servlet引擎启动时,所需的servlet类必须由 servlet容器。 servlet容器使用普通的Java类加载servlet类 装载设施。 ... 加载Servlet类后,容器将其实例化以供使用。
然后是eol,
servlet容器不需要为任何特定的内容加载servlet 一段时间。 servlet实例可以在servlet容器中保持活动状态 servlet容器的生命周期的毫秒数(可能是一个 天数,月数或年数),或介于两者之间的任何时间。 当servlet容器确定应该从中删除servlet时 service,它调用Servlet接口的destroy方法来允许servlet 释放它正在使用的任何资源并保存任何持久状态。例如, 容器可能会在想要节省内存资源时执行此操作,或者何时执行此操作 被关闭 在servlet容器调用destroy方法之前,它必须允许任何线程 当前正在servlet的服务方法中运行以完成执行,或者 超过服务器定义的时间限制。 在servlet实例上调用destroy方法后,容器可能无法路由 对该servlet实例的其他请求。如果容器需要启用 再次使用servlet,它必须使用servlet类的新实例。 destroy方法完成后,servlet容器必须释放servlet 实例,以便它有资格进行垃圾回收。
所以我认为底线,servlet规范不能保证servlet保存多长时间,它是特定于实现的,但我认为如果你在启动时加载它是一个非常安全的赌注,它将保持加载状态服务器一直在运行。
对于您的特定用例,请遵循WhiteFang34,因为使用servlet处理服务请求以外的其他内容会滥用API IMO。
[编辑] 无处不在,我想看看如何管理servlet的生命周期似乎表明它将在整个webapps生命周期内保持加载状态。
What is the difference between JSF, Servlet and JSP?
java servlet instantiation and session variables
但是我无处可以找到这样的参考,所以我只是不确定。