【发布时间】:2011-05-12 16:33:58
【问题描述】:
我部署了一个 Tomcat 服务器,它接收从传感器以 JSON 格式传输的观察结果。我还有一个传感器描述我想使用的本体。
但是,我想在服务器接收到任何传感器观察结果之前加载本体。如何在加载 Tomcat 后立即实例化对象?
【问题讨论】:
我部署了一个 Tomcat 服务器,它接收从传感器以 JSON 格式传输的观察结果。我还有一个传感器描述我想使用的本体。
但是,我想在服务器接收到任何传感器观察结果之前加载本体。如何在加载 Tomcat 后立即实例化对象?
【问题讨论】:
要在应用程序启动或停止时执行操作,您应该使用 ServletContextListener: http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html
在 web.xml 中:
<web-app>
...
<listener>
<listener-class>com.example.Listener</listener-class>
</listener>
...
</web-app>
与 Peter Knego 的提议相反,此解决方案可移植到任何 servlet 容器,而不仅限于 Tomcat。
【讨论】:
您可以使用event listeners,它会在加载 Web 应用程序 (contex) 时调用。在那里您初始化您的对象并将它们保存到ServletContext,在那里它们将可供您应用程序中的所有 servlet 使用。
实现ServletContextListener 并在其中放入contextInitialized():
contextInitialized(ServletContextEvent sce){
// Create your objects
Object myObject = ...
sce.getServletContext().setAttribute("myObjectKey", myObject);
}
然后在Tomcat context.xml中register the listener:
<Context path="/examples" ...>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Context>
【讨论】:
我认为严格来说,您想要做的是在 您的 servlet 被 Tomcat 加载后立即实例化一个对象。 (为了特定于应用程序的功能而修改 Tomcat 本身并没有任何意义)。
在这种情况下,您的Servlet 类可以覆盖/实现init(ServletConfig config) 方法。这在 servlet 初始化时由 servlet 容器(在本例中为 Tomcat)调用,并且正是执行静态启动逻辑的正确位置,例如您在此处所指的那种。
事实上,在它的 init 方法返回之前,servlet 甚至无法接收连接,因此您可以保证在传感器观察到达之前本体将被完全加载。
【讨论】: