4

我部署了一个 Tomcat 服务器,它接收从传感器以 JSON 格式传输的观察结果。我还有一个描述我想使用的本体的传感器。

但是,我想在服务器接收到任何传感器观察结果之前加载本体。如何在加载 Tomcat 后立即实例化对象?

4

3 回答 3

7

要在应用程序启动或停止时执行操作,您应该使用:http ServletContextListener: //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。

于 2010-11-19T15:24:08.763 回答
1

我认为严格来说,您想要做的是在 Tomcat 加载您的 servlet后立即实例化一个对象。(为了特定于应用程序的功能而修改 Tomcat 本身并没有任何意义)。

在这种情况下,您的Servlet类可以覆盖/实现该init(ServletConfig config)方法。这在 servlet 初始化时由 servlet 容器(在本例中为 Tomcat)调用,并且正是执行静态启动逻辑的正确位置,例如您在此处所指的那种。

事实上,在它的 init 方法返回之前,servlet 甚至无法接收连接,因此您可以保证在传感器观察到达之前本体将被完全加载。

于 2010-11-19T15:05:06.753 回答
0

您可以使用加载 Web 应用程序(contex)时调用的事件侦听器。在那里你初始化你的对象并将它们保存到ServletContext它们对你的应用程序中的所有 servlet 可用的地方。

实施ServletContextListenercontextInitialized()放入:

contextInitialized(ServletContextEvent sce){

    // Create your objects
    Object myObject = ...

    sce.getServletContext().setAttribute("myObjectKey", myObject);
} 

然后在Tomcat context.xml中注册监听器:

<Context path="/examples" ...>
    ...
    <Listener className="com.mycompany.mypackage.MyListener" ... >
    ...
</Context>
于 2010-11-19T15:20:03.303 回答