我部署了一个Tomcat服务器,它接收从JSON格式的传感器传输的观察结果。我还有一个传感器描述了我想要使用的本体。
但是,我想在服务器接收到任何传感器观察之前加载本体。如何在加载Tomcat后立即实例化对象?
答案 0 :(得分:7)
要在应用程序启动或停止时执行操作,您应使用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。
答案 1 :(得分:1)
我认为严格来说,你想要做的是在Tomcat加载你的servlet 后立即实例化一个对象。 (对于特定于应用程序的功能,修改Tomcat本身没有任何意义。)
在这种情况下,您的Servlet
类可以覆盖/实现init(ServletConfig config)
方法。当初始化servlet时,servlet容器(在本例中为Tomcat)调用它,并且它是执行静态启动逻辑的正确位置,例如您在此处引用的类型。
实际上,servlet在返回init方法之前甚至无法接收连接,因此您可以保证在传感器观察到达之前将完全加载本体。
答案 2 :(得分:0)
您可以使用在加载Web应用(contex)时调用的event listeners。在那里,您初始化对象并将其保存到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>