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